ITextSharp合并多个pdf的内存不足异常

时间:2015-04-02 14:08:18

标签: c# pdf memory memory-leaks itextsharp

我必须将多个1页pdf合并为一个pdf。我使用iTextSHarp 5.5.5.0来实现这一目标,但是当我合并超过900-1000 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的各种问题,但在我看来,我采取了所有建议来保持较低的内存使用率,但这并没有发生。 有什么想法吗?

1 个答案:

答案 0 :(得分:6)

由于这是大量的内容,我建议您直接写入FileStream而不是MemoryStream。这可能是一个实际情况,其中内存不足异常可能意味着&#34;内存不足&#34;。

此外,正如布鲁诺指出的那样,&#34; smart&#34;不幸的是,PdfSmartCopy的一部分也是以记忆为代价的。切换到PdfCopy可能会降低内存压力,尽管您的最终PDF可能会更大。