2011-08-09 128 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對於這些類型的任務非常有用。儘管如此,還沒有嘗試過這麼大的文件。

相關問題