我正在为自己编写一个小工具,使用PDFSharp库合并PDF文件。我正在使用PDFSharp的最新预发布版本(1.5)。
我遇到的问题是,当超出范围时,加载到内存中的文档不会释放。我将这个内存泄漏跟踪到代码的以下部分:
using (var mergedDocument = new PdfDocument())
{
for (var i = 0; i < SelectedDocuments.Count; i++)
{
using (var document = PdfReader.Open(SelectedDocuments[i].FilePath, PdfDocumentOpenMode.Import))
{
for (var j = 0; j < document.PageCount; j++)
{
mergedDocument.AddPage(document.Pages[j]);
}
}
}
mergedDocument.Save(savePath);
}
一个例子是我有10个pdf文件,总计178 Mb。创建的合并文档也大约为178 Mb。当上面的代码完成后,执行内存使用量保持在356 Mb。当我合并更多文档时,这个内存泄漏会持续上升并最终导致崩溃。
当我希望从内存中释放文档时,我尝试删除使用语句并使用Dispose(),但它不能正常工作。
任何帮助将不胜感激。谢谢。
编辑:
更确切地说:
var parentDirectory = Directory.GetParent(SelectedDocuments[0].FilePath);
var savePath = parentDirectory + "\\MergedDocument.pdf";
using (var mergedDocument = new PdfDocument())
{
for (var i = 0; i < SelectedDocuments.Count; i++)
{
using (var document = PdfReader.Open(SelectedDocuments[i].FilePath, PdfDocumentOpenMode.Import))
{
for (var j = 0; j < document.PageCount; j++)
{
mergedDocument.AddPage(document.Pages[j]);
}
}
}
mergedDocument.Save(savePath);
}
SelectedDocuments是一个列表,其中包含一系列指向所选PDF文件的文件路径。
答案 0 :(得分:1)
我最后使用iTextSharp代替以下代码以避免内存问题:
var parentDirectory = Directory.GetParent(SelectedDocuments[0].FilePath);
var savePath = parentDirectory + "\\MergedDocument.pdf";
using (var fs = new FileStream(savePath, FileMode.Create))
{
using (var document = new Document())
{
using (var pdfCopy = new PdfCopy(document, fs))
{
document.Open();
for (var i = 0; i < SelectedDocuments.Count; i++)
{
using (var pdfReader = new PdfReader(SelectedDocuments[i].FilePath))
{
for (var page = 0; page < pdfReader.NumberOfPages;)
{
pdfCopy.AddPage(pdfCopy.GetImportedPage(pdfReader, ++page));
}
}
}
}
}
}