【问题标题】:how to avoid 'System.OutOfMemoryException' Merging large number of PDF files using iTextSharp in asp.net mvc c#如何避免'System.OutOfMemoryException'在asp.net mvc c#中使用iTextSharp合并大量PDF文件
【发布时间】:2021-09-12 07:15:35
【问题描述】:

我在 asp.net mvc c# 中使用 iTextSharp 合并大量 pdf 文件,它适用于少量文件,但是当它达到大约 (1000) 个文件时,它会在 pdf.AddDocument(reader);并抛出“System.OutOfMemoryException”。 我已经在使用 PdfCopy 和 FileStream 来更好地利用我搜索的每个地方都建议的内存。我的代码如下。请建议我如何处理。

        using (FileStream stream = new FileStream(outMergeFile, FileMode.Create))
        {
            Document document = new Document();
            PdfCopy pdf = new PdfCopy(document, stream);
            PdfReader reader = null;
            PdfReader.unethicalreading = true;
            try
            {
                document.Open();
                for (int i = 0; i < fileList.Count; i++)
                {
                    var fileStr = Request.MapPath(fileList[i].Path)                            
                    reader = new PdfReader(fileStr);
                        
                    pdf.AddDocument(reader);
                    reader.Close();
                }
            }
            catch (Exception ex)
            {
                reader.Close();
            }
            finally
            {
                document.Close();
            }
        }

【问题讨论】:

  • 您是在 32 位还是 64 位运行 IIS?
  • 感谢您的快速回复,我使用的是 64 位的 IIS。
  • 要么改进你的实现,要么添加更多内存,这是没有办法的。
  • 您的代码不太正确。 Document, PdfCopy, PdfReader 是一次性物品。他们必须有using 语句。它们都应该在for 循环内;不在外面。
  • @KosalaW 在 itext DisposeClose 的情况下基本上做同样的事情,并且操作尝试关闭。因此,他们不必使用using。但这绝对是一种很好的风格。

标签: c# asp.net-mvc pdf itext out-of-memory


【解决方案1】:

添加

pdf.FreeReader(reader);

就在之前

reader.Close();

以确保管理从该reader 复制的内容所需的内存尽可能少。

该方法(PdfCopy 的父类)记录为将阅读器写入文档并释放它使用的内存。主要用途是连接多个文档以将内存使用限制在当前附加文档中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2011-08-27
    • 2011-04-24
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多