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));
                    }
                }
            }
        }
    }
}