2011-08-09 97 views
12

我正在获取大量数据的PDF文件。目前的PDF为350 MB,大约有40000页。这当然会是很高兴得到较小的PDF文件,但这是我有现在:-(将巨大的40000页PDF分割为单页,itextsharp,outofmemoryexception

我可以在Acrobat Reader一些延迟加载时,但在那之后的Acrobat Reader快速打开它的工作。

现在我需要拆分大文件到单页,然后尝试从PDF页面看了一些收件人数据,然后发送给每个收件人应该得到每个特定收件人一两页。

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

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

接下来发生的第二行“新PdfReader”然后停留在那里大概10分钟,进程大小约1.7 GB,然后出现OutOfMemoryException异常。

我认为“新PdfReader”尝试读取整个PDF到内存中。

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

+2

Wolfram Alpha表示,双面打印的40,000页文档将是80英寸高 - 超过2米。 – Cheeso

+2

只是好奇心,这是什么PDF? –

+0

http://stackoverflow.com/questions/656351/can-anyone-recommend-a-good-pdf-reading-library-for-net可能会有助于尝试另一个或两个库,以查看是否有更好的读取属性。 –

回答

15

从我已阅读,它看起来实例,你应该使用需要在RandomAccessFileOrArray对象的构造的PdfReader时等。免责声明:我没有尝试过自己。

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

在我刚刚运行在一个简单的40,000页PDF上的测试中,当使用'PdfReader(string)'构造函数时,花费了13.5秒,而'PdfReader(RandomAccessFileOrArray,Byte [])'构造函数花费了2.2秒(6时间更快),所以我必须同意你的建议。 –

+0

这解决了这个问题。我现在可以分割PDF。谢谢。 – tomsv

3

这是一个在黑暗中总出手了,我还没有测试此代码 - 这是从一个代码片段“的iText在行动”的书,给出了如何处理较大的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)); 
1

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

相关问题