2015-04-02 28 views
3

我必須將多個1頁PDF合併爲一個pdf。我正在使用iTextSHarp 5.5.5.0來完成這個任務,但是當我合併超過900-1000個pdf時,我收到了一個內存不足異常。我注意到即使我釋放我的閱讀器並關閉它,內存也不會被正確清理(進程使用的內存量永遠不會減少),所以我想知道我可能會做錯什麼。這是我的代碼:ITextSharp內存不足異常合併多個pdf

using (MemoryStream msOutput = new MemoryStream()) 
     { 
      Document doc = new Document(); 
      PdfSmartCopy pCopy = new PdfSmartCopy(doc, msOutput); 
      doc.Open(); 
      foreach (Tuple<string, int> file in filesList) 
      { 
       PdfReader pdfFile = new PdfReader(file.Item1); 
       for (int j = 0; j < file.Item2; j++) 
        for (int i = 1; i < pdfFile.NumberOfPages + 1; i++)//in this case it's always 1. 
         pCopy.AddPage(pCopy.GetImportedPage(pdfFile, i)); 
       pCopy.FreeReader(pdfFile); 
       pdfFile.Close(); 
       File.Delete(file.Item1); 
      } 
      pCopy.Close(); 
      doc.Close(); 

      byte[] content = msOutput.ToArray(); 
      using (FileStream fs = File.Create(Out)) 
      { 
       fs.Write(content, 0, content.Length); 
      } 
     } 

而不會繼續寫文件,我的p.Copy()時出現內存不足的異常AddPage()的一部分。我甚至嘗試刷新pCopy變量,但沒有改變任何東西。我查看了iText的文檔以及圍繞StackOverflow的各種問題,但在我看來,我正在採取每個建議來保持內存使用率較低,但這並未發生。 有關於此的任何想法?

+3

使用'PdfCopy'而不是'PdfSmartCopy'。 'PdfSmartCopy'是「聰明的」,因爲它可以保存大量內存。 – 2015-04-02 14:09:59

+5

也可以直接寫入'FileStream'而不是'MemoryStream'。你可能真的會用完內存。 – 2015-04-02 14:10:27

+0

Hy,非常感謝你非常快速的迴應,PdfCopy代替了PdfSmartCopy很好,並且將內存使用減少到接近一半,但FileStream好得多,我現在只用了15 MB的內存而不是1GB,而不是壞。我可以使用PDfSmartCopy生成更小的PDF。如果你作出回答,我會贊成並接受,謝謝。 – 2015-04-02 14:18:05

回答

5

由於這是一個大量的東西,我建議直接寫入FileStream而不是MemoryStream。這可能是一個實際情況,其中內存不足異常可能字面意思是「內存不足」。

另外,正如Bruno所指出的,PdfSmartCopy的「智能」部分不幸也是以內存爲代價的。切換到PdfCopy應該會降低內存壓力,儘管您的最終PDF可能會更大。