4

我的问题是,每次使用 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

4

2 回答 2

12

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

该文档将其描述如下:

销毁当前文档实例并终止工作人员。

来源: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();
 
于 2017-01-11T21:49:08.440 回答
1

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

delete pdfViewer;
delete documentPdf;

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

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

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

或者

container.parentNode.removeChild(container);
于 2016-11-30T14:23:54.973 回答