viewer.js/pdf.js:每次渲染pdf时内存使用量都会增加

cho*_*ake 3 javascript memory pdf angularjs pdfjs

我的问题是每次使用viewer.js呈现pdf文件时,我的应用程序的内存使用量都会增加.

我这样渲染我的pdf:

container = document.getElementById('viewerContainer');
viewer = document.getElementById('viewer');

pdfViewer = new PDFViewer({
    container: container,
    viewer: viewer
});

$scope.pdfFindController = new PDFFindController({
      pdfViewer: pdfViewer
});

pdfViewer.setFindController($scope.pdfFindController);

container.addEventListener('pagesinit', function () {
    pdfViewer.currentScaleValue = 'page-width';                            
});

PDFJS.getDocument($scope.getPageLink(pdf)).then(function (pdfDocument) {
    documentPdf = pdfDocument;
    pdfViewer.setDocument(pdfDocument);                       
});
Run Code Online (Sandbox Code Playgroud)

我在单独的视图中呈现文件.当我回到上一个视图并打开另一个文件时,内存使用量增加了大约20MB.

我试过这个:

documentPdf.destroy();
Run Code Online (Sandbox Code Playgroud)

现在,内存使用量略有下降,但没有以前分配的那么多.

这有解决方案吗?

更新:

Pdf.js版本:1.6.210

pdf.js工人版:1.6.210

duf*_*356 9

您需要在DocumentPageProxy的promise上调用destroy方法.

文档描述如下:

销毁当前文档实例并终止worker.

来源:https://github.com/mozilla/pdf.js/blob/master/src/display/api.js(第621行)

当前pdf.js库中有一些测试,它们测试destroy方法的行为.(https://github.com/mozilla/pdf.js/blob/master/test/unit/api_spec.js (第86行)

在你的情况下像:

 // a variable to store the callback function
 var loadingTask = PDFJS.getDocument(basicApiUrl);

...

 // when the document should get destroyed call
 loadingTask.destroy();
Run Code Online (Sandbox Code Playgroud)

  • 我遇到了同样的问题,并在pdf.js中进行了分析-然后我找到了您的帖子,至少我回答了它。有时我会回答其他帖子以获取我的个人文档;) (2认同)

Gio*_*z89 1

我认为通过调用documentPdf.destroy();您不会释放所占用的内存pdfViewer:我没有找到任何销毁方法pdfViewer,但您可以尝试调用

delete pdfViewer;
delete documentPdf;
Run Code Online (Sandbox Code Playgroud)

如果您不确定删除属性就足够了,您可以将两者都设置为null

如果您仍然遇到内存泄漏,则可能是历史缓存中存储的 HTML 正在耗尽您的内存,因此请尝试用空元素替换查看器或容器 HTML(或将其完全删除)

document.getElementById('viewerContainer').outerHTML = '';
Run Code Online (Sandbox Code Playgroud)

或者

container.parentNode.removeChild(container);
Run Code Online (Sandbox Code Playgroud)