将巨大的40000页PDF分割成单个页面,extsharp, outofmemoryexception

本文关键字:单个页 extsharp outofmemoryexception 分割 巨大 40000页 PDF | 更新日期: 2023-09-27 18:05:04

我正在获取包含大量数据的巨大PDF文件。目前的PDF大小为350mb,大约有40000页。当然,如果能得到更小的pdf就好了,但这就是我现在必须处理的:-(

)

我可以在acrobatreader中打开它,加载时有一些延迟,但之后acrobatreader很快。

现在我需要将这个巨大的文件分割成单个页面,然后尝试从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更好吗?

将巨大的40000页PDF分割成单个页面,extsharp, outofmemoryexception

从我所读到的,它看起来像在实例化PdfReader时,你应该使用在RandomAccessFileOrArray对象中接受的构造函数。免责声明:我自己没有试过。

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

这完全是在黑暗中拍摄的,我还没有测试过这个代码-它是从'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));

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

对于读取收件人数据,pdftextstream可能是一个不错的选择。

PDF Toolkit对于这些类型的任务非常有用。但我还没有尝试过这么大的文件

使用其他库比使用itextsharp更好吗?

请尝试。net的Aspose.Pdf,它允许您将PDF拆分为单个页面,或者您可以使用文件或内存流以各种方式将PDF拆分为不同的页面集。API非常容易学习和使用。它适用于具有大量页面的大型PDF文件。

披露:我是Aspose的开发者布道师