iText/iTextSharp 5.5.0与pdf突发错误

iText/iTextSharp 5.5.0与pdf突发错误,pdf,itextsharp,itext,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 nu

以下代码在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();
}
var file=newfileinfo(args[0]);
字符串名称=file.name.Substring(0,file.name.LastIndexOf(“.”);
//我们为某个文档创建一个阅读器
变量读取器=新的PdfReader(参数[0]);
//我们检索总页数
int numberOfPages=reader.numberOfPages;
WriteLine(“原始文件中有“+n+”个页面”);
文件;
字符串文件名;
PdfCopy副本;

对于(int pageNumber=1;iiTextSharp页码是以一为基础的,而不是零。这两行正确地解释了这一点:

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();
}

for(int pagenumber=1;pagenumberiTextSharp页码是以一为基础的,而不是零。这两行正确地解释了这一点:

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();
}

for(int pagenumber=1;pagenumber我终于搞定了。导致此问题的原因是最新版本中对iText的更改,具体来说,问题在于
PdfReaderInstance.cs
文件的
writealPages
。在该文件中,行

file.Close();
是罪魁祸首。原因是
Document.Close
方法将调用
PdfCopy.Close
方法,该方法将依次调用
PdfReaderInstance.writealPages
方法,然后所有hell都会消失

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


希望此信息对其他人有所帮助。

我终于解决了它。导致此问题的是最新版本中iText的更改,具体而言,问题在于
PdfReaderInstance.cs
文件的
writealPages
。在该文件中,行

file.Close();
是罪魁祸首。原因是
Document.Close
方法将调用
PdfCopy.Close
方法,该方法将依次调用
PdfReaderInstance.writealPages
方法,然后所有hell都会消失

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


希望这些信息对其他人有所帮助。

我很惊讶,有这样一个bug的代码被称为适用于TextSharp 5.2.1…嗨,这段代码不是我的。我的代码实际上使用的是一个基于索引的索引,但它更复杂,所以我搜索了一些代码示例。所以问题不是索引,而是iText的行为变化。我更新了示例代码,以减少混淆。但请查看我发布的错误和我现在使用的演练。所有5.2.x版本的iText都已从官方存储库中删除,因为它们包含一个非常严重的错误:您能否共享一个有问题的PDF文档?错误似乎取决于输入文件。我们不能用随机的PDF文档在本地复制它。我很惊讶有这样一个bug的代码被称为适用于TextSharp 5.2.1…嗨,这段代码不是我的。我的代码实际上使用的是一个基于索引的索引,但它更复杂,所以我搜索了一些代码示例。所以问题不是索引,而是我的行为改变文本。我更新了示例代码以减少混淆。但请查看我发布的错误和我现在使用的演练。所有5.2.x版本的iText都已从官方存储库中删除,因为它们包含一个非常严重的错误:您能否共享一个有问题的PDF文档?错误似乎取决于e输入文件。我们不能用随机的PDF文档在本地复制它。@chrispepper1989,我已经有一段时间没有写答案了,但是从根本原因分析来看,走查是显而易见的,不要调用
document.Close();
在end@chrispepper1989,我已经有一段时间没有写答案了,但是从根本原因分析来看,绕圈子是显而易见的,不要在最后调用
document.Close();