2016-11-30 129 views
-1

我的問題是每次使用viewer.js渲染pdf文件時,我的應用程序的內存使用率都會增加。viewer.js/pdf.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(); 

現在,內存使用量下降了一點,但並不像它之前分配。

有沒有解決方案呢?

UPDATE

Pdf.js版本:1.6.210

pdf.js工人版本:1.6.210

+0

確保你衡量內存後垃圾回收已運行(某些瀏覽器可以通過他們的工具強制GC做到這一點),它的建議要使用相同的PDFWorker,您正在嘗試在同一頁面上使用多個文檔:'documentPdf.destroy();'是正確的一步。如果您不重複使用相同的pdfViewer作爲setDocument,請確保清除所有包含pdfFindController的舊文件。 – async5

+0

pdfjs項目中沒有可用的angularjs包。如果沒有提供完整的示例或提及使用的包(供應商),則很難說明或重現。 – async5

+0

我使用Xcode查看內存使用情況。因爲我爲iOS構建它。 PDFWorker應該是相同的。我只是每次設置參考PDFJS.workerSrc ='lib/pdfviewer/pdf.worker.js';'。我刪除並設置像Giovazz89推薦的變量。難道那個viewer.js /pdf.js仍然有一些參考?實際上,它們應該被覆蓋,並且我也摧毀了該文件中的文檔。是否可以清除一個文件中的所有變量? –

回答

1

我認爲,通過調用documentPdf.destroy();你不釋放內存採取pdfViewer: 我沒有找到任何方法來銷燬pdfViewer,但您可以嘗試致電

delete pdfViewer; 
delete documentPdf; 

如果您不確定刪除屬性是否足夠,則可以將它們都設置爲null

如果仍然遇到內存泄漏它可以是存儲在歷史緩存中的HTML是使用你的內存,因此嘗試更換一個空元素觀衆或容器HTML(或完全刪除)

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

container.parentNode.removeChild(container); 
+0

謝謝你的回答!不幸的是,內存仍然增加... –

+0

你試過刪除事件$ scope.pdfFindController變量嗎?我希望它不是keepeng其他對象實例 – Giovazz89

+0

我試過'$ scope.pdfFindController = null'和'delete $ scope.pdfFindController'。沒有工作......'null'和'undefined'之間可能有區別嗎? –

3

你需要呼籲DocumentPageProxy的承諾銷燬方法。

該文檔描述了它如下:

銷燬當前文檔實例和終止工人。

來源:https://github.com/mozilla/pdf.js/blob/master/src/display/api.js(線621)

有當前pdf.js庫,測試方法破壞的行爲,一些測試。 (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(); 
+0

感謝您的回答。現在這個問題對我來說已經過時了,因爲我會使用比pdf.js更好的cordova pdf viewer插件:https://github.com/sitewaerts/cordova-plugin-document-viewer –

+1

我有同樣的問題,並在pdf.js中分析它 - 然後我發現你的帖子,至少我回答了它。有時候,我會回覆其他職位以獲取個人文檔;) – duffy356

相關問題