2012-12-04 53 views
0

我有一個程序,需要幾個pdf(甚至1000+),並將它們合併成一個pdf。iTextSharp pdf合併後臺問題

該程序完美地工作,但我面臨一個假脫機錯誤。

如果我用Acrobat打開合併的PDF並打印它,而不是發送n頁的單個卷軸到打印機,它會發送與原始pdf數量一樣多的卷軸,導致打印機處理速度非常慢。

這是類

Document document = new Document (iTextSharp.text.PageSize.A4); 
PdfWriter writer = PdfWriter.GetInstance (document, new FileStream (outputFilename, FileMode.Create)); 
writer.SetFullCompression();    
document.Open(); 
PdfContentByte cb = writer.DirectContent; 

foreach(var file in files) { 
PdfReader reader = new PdfReader (file); 
int n = reader.NumberOfPages; 
int i = 0; 
while (i < n) 
{ 
    i++; 
    document.SetPageSize (reader.GetPageSizeWithRotation (i));     
    document.NewPage(); 
    page = writer.GetImportedPage (reader, i); 
    rotation = reader.GetPageRotation (i);   
    cb.AddTemplate (page, 1f, 0, 0, 1f, 0, 0); 
} 
} 

document.Close(); 

回答

1

的抽象請下載在行動iText的的Chapter 6 - 第二版。你會發現你使用錯誤的類連接PDF。我一遍又一遍地重複,我真的想知道是什麼讓你使用PdfWriter而不是Pdf(Smart)Copy連接PDF。您是否在網站的某個地方找到了代碼示例?如果是這樣,請讓我知道,這樣我們就可以將該頁面的作者一起打下!

如果您使用您的代碼示例,則將頁面導入爲XObjects。這增加了可能導致問題的嵌套級別,因爲嵌套級別有限制。另外,當您將頁面一頁一頁地添加到PdfWriter時,您的PDF包含的信息太多的冗餘信息存在風險:您的文件可能會變得臃腫。這可以通過使用PdfSmartCopy來避免。

最後(不在書中的東西):在從PdfReader對象中複製所有頁面後,應使用FreeReader()方法。這將顯着加快您的代碼,並減少所需的內存。

我知道以上都沒有解釋爲什麼不同的線軸被髮送到打印機,但讓我們先從您的代碼中的明顯缺陷開始,然後從那裏開始。

+0

謝謝你的提示。另外,它也解決了假脫機問題;)。我不記得這幾年我使用它的代碼的來源,但很高興知道我不會再使用PdfWriter:D –