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

时间:2016-11-30 13:55:04

标签: javascript angularjs pdf memory 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);                       
});

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

我试过了:

documentPdf.destroy();

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

有解决方法吗?

更新

Pdf.js版本:1.6.210

pdf.js工人版:1.6.210

2 个答案:

答案 0 :(得分:7)

您需要在DocumentPageProxy的承诺上调用destroy方法。

文档描述如下:

  

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

     

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

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

在你的情况下:

pdf.js

答案 1 :(得分:1)

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

delete pdfViewer;
delete documentPdf;

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

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

document.getElementById('viewerContainer').outerHTML = '';

container.parentNode.removeChild(container);