首页 文章

将巨大的40000页pdf分成单页,itextsharp,outofmemoryexception

提问于
浏览
13

我正在获取包含大量数据的巨大PDF文件 . 当前的PDF为350 MB,大约有40000页 . 获得较小的PDF当然很不错,但这就是我现在要处理的事情:-(

我可以在acrobat阅读器中打开它,但在加载时有一些延迟,但在那之后acrobat阅读器很快 .

现在我需要将大文件拆分成单个页面,然后尝试从pdf页面读取一些收件人数据,然后将每个收件人应该获得的一个或两个页面发送给每个特定收件人 .

到目前为止,这是我使用itextsharp的非常小的代码:

var inFileName = @"huge350MB40000pages.pdf";
PdfReader reader = new PdfReader(inFileName);
var nbrPages = reader.NumberOfPages;
reader.Close();

接下来第二行“new PdfReader”会在那里停留大概10分钟,进程大小达到1.7 GB,然后我得到一个OutOfMemoryException .

我认为“新的PdfReader”试图将整个PDF读入内存 .

有没有其他/更好的方法来做到这一点?例如,我可以以某种方式只将PDF文件的一部分读入内存而不是一次只读取所有内容吗?使用除itextsharp之外的其他库可以更好地工作吗?

5 回答

  • 0

    从我读过的内容看,在实例化PdfReader时,您应该使用接收RandomAccessFileOrArray对象的构造函数 . 免责声明:我自己没试过 .

    iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(new iTextSharp.text.pdf.RandomAccessFileOrArray(@"C:\PDFFile.pdf"), null);
    
  • 0

    这是在黑暗中完全拍摄的,我还没有测试过这段代码 - 它是“iText In Action”一书中的代码摘录,作为如何处理大型PDF文件的示例 . 代码是用Java编写的,但应该很容易转换 -

    这是将所有内容加载到内存中的方法 -

    PdfReader reader;
    long before;
    before = getMemoryUse();
    reader = new PdfReader(
    "HelloWorldToRead.pdf", null);
    System.out.println("Memory used by the full read: "
    + (getMemoryUse() - before));
    

    这是节省内存的方式,文档应根据需要逐位加载 -

    before = getMemoryUse();
    reader = new PdfReader(
    new RandomAccessFileOrArray("HelloWorldToRead.pdf"), null);
    System.out.println("Memory used by the partial read: "
    + (getMemoryUse() - before));
    
  • 0

    您可以直接使用Ghostscript . http://svn.ghostscript.com/ghostscript/tags/ghostscript-9.02/doc/Use.htm#One_page_per_file

    为了阅读收件人数据,pdftextstream可能是一个不错的选择 .

  • 16

    PDF Toolkit对于这些类型的任务非常有用 . 尽管如此,还没有尝试过如此庞大的文件 .

  • 4

    使用除itextsharp以外的其他库可以更好地工作吗?

    请尝试Aspose.Pdf for .NET,它允许您split the PDF into single pages或您可以split the PDF to different sets of pages以各种方式,使用文件或内存流 . API非常易于学习和使用 . 它适用于具有大量页面的大型PDF文件 .

    披露:我在Aspose担任开发人员传播者 .

相关问题