PDFSharp不处理资源(内存泄漏)

时间:2016-03-20 16:31:17

标签: c# memory-management memory-leaks dispose pdfsharp

我正在为自己编写一个小工具,使用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文件的文件路径。

1 个答案:

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