C# iText 7.0.4.0-PdfWriter为某些PDF文件输入生成损坏的PDF

C# iText 7.0.4.0-PdfWriter为某些PDF文件输入生成损坏的PDF,c#,itext,itext7,C#,Itext,Itext7,我遇到一个问题,来自iText 7.0.4.0(.NET 4.5.1)的PdfWriter为某些输入PDF文件生成损坏的PDF文档 更详细地说,包含格式良好段落的PDF文件没有问题。但是,如果输入的PDF包含不规则的内容(缺少更好的文字;请参阅中的示例),PdfWriter会生成损坏的PDF文件;所谓损坏,我的意思是文件可以打开,但它显示了一个具有极高缩放率的空白页面(在Adobe Reader XI中)。前面提到的Google drive链接中也提供了损坏的示例 示例代码: using (va

我遇到一个问题,来自iText 7.0.4.0(.NET 4.5.1)的PdfWriter为某些输入PDF文件生成损坏的PDF文档

更详细地说,包含格式良好段落的PDF文件没有问题。但是,如果输入的PDF包含不规则的内容(缺少更好的文字;请参阅中的示例),PdfWriter会生成损坏的PDF文件;所谓损坏,我的意思是文件可以打开,但它显示了一个具有极高缩放率的空白页面(在Adobe Reader XI中)。前面提到的Google drive链接中也提供了损坏的示例

示例代码:

using (var pdfReader = new PdfReader("sample1_input.pdf"))
{
    PdfDocument pdfDoc = new PdfDocument(pdfReader, new PdfWriter("sample1_corrupted_output.pdf"));

    // Trying to highlight a part of PDF by referencing this example:
    // https://developers.itextpdf.com/examples/stamping-content-existing-pdfs/clone-highlighting-text
    // Commented out for now because PdfWriter is producing corrupted PDF documents for the samples and similar PDF files.
    //PdfCanvas canvas = new PdfCanvas(pdfDoc.GetFirstPage());
    //canvas.SetExtGState(new PdfExtGState().SetFillOpacity(0.1f));
    //canvas.SaveState();
    //canvas.SetFillColor(Color.YELLOW);
    //canvas.Rectangle(100, 100, 200, 200);
    //canvas.Fill();
    //canvas.RestoreState();

    pdfDoc.Close(); // Corrupted PDF file is produced, even without highlighting.
}
我注意到的一件“有趣”的事情是,如果我提供“new StampingProperties().UseAmpendMode()”作为PdfDocument的第三个参数(没有突出显示的代码),PdfWriter会吐出原始文件(尽管由于某些原因比原始文件大几kb)。但是,当突出显示代码未注释时,PdfWriter会返回到生成损坏的PDF

链接到示例文件: sample1_input.pdf(输入样本#1)->sample1_损坏的#输出.pdf(损坏的输出) sample2_input.pdf(输入样本#2)->sample2_损坏的#输出.pdf(损坏的输出)


请给出一些建议。

导致此损坏的原因是相关PDF页面树的异常结构:

这在两方面是不寻常的:

  • 它有一个没有任何页面对象的子树(字典17和21)
  • 它有一个具有混合子节点类型的节点(字典10有一个页面子节点3和一个页面子节点17)
如果删除无页子树(通过从对象10的子对象中删除对象17),这两个怪癖都会被删除,代码也不会再失败

虽然这两个怪癖都很奇怪,但我在ISO 32000-1中没有看到任何东西(不幸的是,我还没有ISO 32000-2的副本)表明这些不寻常的结构被明确禁止。因此,我假设这是一个iText错误


我可以用iText 7.0.4 for Java重现这个问题,但不能重现当前7.0.5的开发快照

事实上,有一个日期为2017-09-19 10:03:37[c0b35f0]的提交被描述为“修复页面树重建中的错误”,其中代码块中的
PdfPagesTree
类的差异被描述为“处理PdfPage和PdfPage的混合”。因此,这一问题似乎已为人所知,并已得到解决


您可以等待7.0.5的发布,也可以寻找7.0.4.x的修补程序。

非常感谢您提供了复杂的答案,先生!以我目前的水平,我永远不会得出这个结论。。。我很想知道你是如何调试这个问题的,如果你感觉良好的话。好吧,首先我复制了这个问题,很明显,但随后我使用浏览器查看了PDF的内部结构,并对该结构、RUP进行了比较。如果你熟悉PDF格式,你很快就会看到那些古怪的东西。