2014-03-25 68 views
0

下面的代碼工作正常上iTextSharp的5.2.1的iText/iTextSharp的5.5.0與PDF突發錯誤

var file= new FileInfo(args[0]); 
string name = file.Name.Substring(0,file.Name.LastIndexOf("."));     
// we create a reader for a certain document 
var reader = new PdfReader(args[0]); 
// we retrieve the total number of pages 
int numberOfPages = reader.NumberOfPages; 
Console.WriteLine("There are " + n + " pages in the original file."); 
Document document; 
string filename; 
PdfCopy copy; 

for (int pageNumber = 1; i <= numberOfPages; i++) 
{ 
    filename = pageNumber.ToString(); 
    filename = "_" + filename + ".pdf"; 
    // step 1: creation of a document-object 
    document = new Document(reader.GetPageSizeWithRotation(pageNumber)); 
    // step 2: we create a writer that listens to the document 
    copy = new PdfCopy(document, new FileStream(name + filename,FileMode.Create)); 
    // step 3: we open the document 
    document.Open(); 
    copy.AddPage(copy.GetImportedPage(reader, pageNumber)); 
    // step 5: we close the document 
    document.Close(); 
} 

但它拋出下面的錯誤上iTextSharp的5.5.0,

頁1被要求但該文件只有0頁。

它似乎是最後一行實際上篡改了讀者實例。有人可以幫我弄清楚嗎?現在我通過爲每個頁面重新創建一個PdfReader實例來解決這個問題,但是對於大型PDF文件來說這很慢。

回答

2

我終於釘上了它。這是iText在最近版本中引起此問題的一個變化,具體而言,問題在於PdfReaderInstance.cs文件的WriteAllPages。其中,該行

file.Close(); 

是罪魁禍首。原因是Document.Close方法會調用PdfCopy.Close方法,然後調用PdfReaderInstance.WriteAllPages方法,然後所有的地獄散開。

從表面上看,關閉文件似乎是一個好習慣,但實際上,這不關你的事,該死的你,PdfReaderInstance

希望此信息有助於他人。

+0

你能解釋一下工作嗎? – chrispepper1989

+1

@ chrispepper1989,自從我寫出答案以來已經有一段時間了,但從根本原因分析來看,漫步是顯而易見的,不要稱爲「文檔」。關閉();'結束 – imgen

2

iTextSharp頁碼是基於一個的,而不是零。這兩條線都正確佔本:

pagenumber = i + 1; 

document = new Document(reader.GetPageSizeWithRotation(pagenumber)); 

但是這條線還是要回你的循環從零開始的索引:

copy.AddPage(copy.GetImportedPage(reader, i)); 

你可以只修改成:

copy.AddPage(copy.GetImportedPage(reader, pagenumber)); 

你可以讓你的整個循環以一個爲基礎,而不用考慮每隔一段時間就需要添加一個

for (int pagenumber = 1; pagenumber <= n; pagenumber++) 
{ 
    filename = pagenumber.ToString(); 
    while (filename.Length< digits) filename = "0" + filename; 
    filename = "_" + filename + ".pdf"; 
    // step 1: creation of a document-object 
    document = new Document(reader.GetPageSizeWithRotation(pagenumber)); 
    // step 2: we create a writer that listens to the document 
    copy = new PdfCopy(document, new FileStream(name+filename,FileMode.Create)); 
    // step 3: we open the document 
    document.Open(); 
    copy.AddPage(copy.GetImportedPage(reader, pagenumber)); 
    // step 5: we close the document 
    document.Close(); 
} 
+0

我很驚訝,有這樣的錯誤代碼聲稱已經爲TextSharp 5.2.1工作... – mkl

+0

嗨,這段代碼不是我的。我的代碼實際上確實使用了基於一個索引,但它更復雜,所以我搜索了一下代碼示例。所以這個問題不是索引,而是iText的行爲改變。 – imgen

+0

我更新了示例代碼以減少混淆。但請查看我發佈的錯誤和我現在使用的解決方法。 – imgen