iText / iTextSharp 5.5.0有pdf突发错误

时间:2014-03-25 09:51:33

标签: pdf itextsharp itext

以下代码在iTextSharp 5.2.1

上工作正常
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 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:2)

我终于把它钉了下来。这是最新版本中iText的更改导致了此问题,具体而言,问题在于WriteAllPages文件的PdfReaderInstance.cs。在其中,行

file.Close();

是罪魁祸首。原因是Document.Close方法将调用PdfCopy.Close方法,然后调用PdfReaderInstance.WriteAllPages方法,然后所有方法都会松散。

从表面上看,关闭文件似乎是一种好习惯,但实际上,这不关你的事,该死的,PdfReaderInstance

希望这些信息可以帮助他人。