PDFSharp 不处理资源(内存泄漏)
PDFSharp not disposing resources (memory leak)
我正在为自己编写一个使用 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。当我合并更多文档时,此内存泄漏不断增加并最终导致崩溃。
当我希望从内存中释放文档时,我尝试删除 using 语句并使用 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 文件的文件路径。
我最终使用 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));
}
}
}
}
}
}
我正在为自己编写一个使用 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。当我合并更多文档时,此内存泄漏不断增加并最终导致崩溃。
当我希望从内存中释放文档时,我尝试删除 using 语句并使用 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 文件的文件路径。
我最终使用 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));
}
}
}
}
}
}