iText 7结合PDF的System.OutOfMemoryException

时间:2019-08-27 11:33:31

标签: c# itext7

我正在尝试编写一个脚本,以使用iText 7和c#将10,000个pdf合并到一个文件中。

我的测试文件每个大约5mb,在270个标记处,我开始获得System.OutOfMemoryException的-即使从任务管理器中看到我只使用了不到25%的可用内存。

这里有代码

string sourceFolder = @"C:\Work\Generated5\";
string outputPath = @"C:\Work\MergeTest.pdf";
int i = 0;
string[] files = Directory.GetFiles(sourceFolder,"*.pdf");

if (files.Length > 0)
{
    Array.Sort(files);

    using (PdfDocument pdf = new PdfDocument(new PdfWriter(outputPath)))
    {
        foreach (var file in files)
        {
            try
            {

                using (var reader = new PdfReader(file))
                {
                    using (PdfDocument sourceDoc = new PdfDocument(reader))
                    {
                        sourceDoc.CopyPagesTo(1, sourceDoc.GetNumberOfPages(), pdf);
                    }
                    reader.Close();
                }
            }
            catch (Exception e)
            {
                e.Message.Dump(file);
            }

            if (i % 200 == 0)
            {
                //desperate attempt to free some memory  - doesn't really help
                GC.Collect(3);
            }
        }
    }
}

我在网上发现了许多示例,并且在此处执行此类操作时堆栈溢出。但是,我发现的文档和以前的答案已经过时,并且在iTextSharp和iText 5中已经过时。在iText 7中似乎不再支持使用的类,而我能够找到的唯一示例是“如何不合并。”

我尝试过的一些东西:

  • 在pdf编写器上启用SmartMode
  • 在pdfwriter上启用压缩功能(抛出异常前,压缩到1600 pdf)
  • 使用PdfMerger代替PdfDocument.copyPages
  • 每X个文档强制执行一些垃圾回收

0 个答案:

没有答案