我需要将多个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上的各种问题,似乎我正在采取每一个建议来保持内存使用率低,但这并没有发生。 对此有什么想法吗?
PdfCopy
替代PdfSmartCopy
。PdfSmartCopy
之所以被称为“智能”是因为它会在内存中保留很多内容。 - Bruno LowagieFileStream
写入内容,而不是使用MemoryStream
。你可能会因为内存不足而出现问题。 - Chris Haas