ITextSharp 合并多个 PDF 文件时出现内存不足异常

5

我需要将多个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上的各种问题,似乎我正在采取每一个建议来保持内存使用率低,但这并没有发生。 对此有什么想法吗?


3
请使用 PdfCopy 替代 PdfSmartCopyPdfSmartCopy 之所以被称为“智能”是因为它会在内存中保留很多内容。 - Bruno Lowagie
6
尝试直接向 FileStream 写入内容,而不是使用 MemoryStream。你可能会因为内存不足而出现问题。 - Chris Haas
嗨,非常感谢您的迅速回复。使用PdfCopy而不是PdfSmartCopy很好,将内存使用减少了近一半,但使用FileStream效果更好,现在我只使用15 MB的内存,而不是1GB,效果不错。我可以使用PDfSmartCopy来生成体积更小的PDF文档。如果您将其作为答案发布,我会点赞并接受,谢谢。 - Daniele Sassoli
1个回答

6

由于这是一大堆东西,我建议直接写入FileStream而不是MemoryStream。这可能是一个实际的情况,其中内存不足异常可能真正意味着"内存不足"。

此外,正如Bruno所指出的那样,PdfSmartCopy的"智能"部分不幸地也需要消耗内存。切换到PdfCopy应该会减少内存压力,尽管您的最终PDF文件可能会更大。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接