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

tom*_*msv 13 c# pdf asp.net out-of-memory itextsharp

我正在获取包含大量数据的巨大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();
Run Code Online (Sandbox Code Playgroud)

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

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

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

Tim*_*sen 16

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

iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(new iTextSharp.text.pdf.RandomAccessFileOrArray(@"C:\PDFFile.pdf"), null);
Run Code Online (Sandbox Code Playgroud)

  • 在我刚刚在一个简单的 40,000 页 PDF 上运行的测试中,当使用 `PdfReader(string)` 构造函数时,它需要 13.5 秒,而 `PdfReader(RandomAccessFileOrArray, Byte[])` 构造函数只需要 2.2 秒(快 6 倍) ,所以我不得不同意你的建议。 (2认同)