当前位置: 首页 > 知识库问答 >
问题:

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

水浩歌
2023-03-14

我有一个问题,其中PdfWriter从iText7.0.4.0(。NET 4.5.1)为某些输入的PDF文件生成损坏的PDF文档。

详细说明,格式良好的段落的PDF文件没有问题。但是,如果输入的PDF包含不规则的内容(对于缺乏更好的词;请参考谷歌驱动器中的示例),PdfWriter会产生损坏的PDF文件;损坏,我的意思是文件可以打开,但它显示的空白页具有极高的缩放(在Adobe Reader XI中)。上述谷歌驱动器链接中也提供了损坏的样本。

示例代码:

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。

链接到示例文件:https://drive.google.com/open?id=0B3NPOZswWocQV09KMW5fbFVyUm8sample1_input.pdf(输入示例#1)-

请好心给点建议。

共有1个答案

张鹏云
2023-03-14

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

这在两方面是不寻常的:

  • 它有一个没有任何页面对象的子树(字典17和21)

如果删除无页子树(通过从对象10的孩子中删除对象17),两个怪癖都被删除,代码不再失败。

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

我可以将iText 7.0.4的问题复制Java但不能复制7.0.5的当前开发SNAPSHOT。

事实上,有一个日期为2017-09-19 10:03:37[c0b35f0]的提交被描述为“修复页面树重建中的错误”,在描述为“PdfPage和PdfPages的句柄混合”的代码块中的PdfPagesTree类中存在差异。因此,这个问题似乎是已知的,并且已经解决了。

您可以等待7.0.5版本或寻找修补程序7.0.4. x。

 类似资料:
  • Docx4J生成的Excel工作簿总是说损坏了,但我无法确定Excel不喜欢底层XML的什么,更不用说如何修复它了。 我的用例如下:我试图定期自动生成一个带有图表和图形的excel工作簿。只有原始数据会改变,但随着原始数据的改变,其他一切都会动态更新。 null null 在我的空白工作簿之前和之后 欢迎所有的想法。

  • 我在android和iText上遇到了一些问题,如果有人能帮忙的话。 android应用程序编写多个页面,每个页面包含不同的表。我没有允许一个表跨越一个页面,而是为每个页面添加一个表,并为下一个页面创建一个新表。这样我就可以控制页面总数、页眉和页脚。 我的问题是Android adobe pdf阅读器显示文档很好,正是我正在寻找的。但是,当我在PC上打开一个窗口以访问平板电脑上的 /mnt/sdc

  • 问题内容: 我正在尝试在Django应用程序中使用Python从SVG输入文件生成PDF。 我已经找到了两个可行的解决方案:cairo + rsvg和imagemagick,但是它们都有一个问题:它们具有一些我不想安装在服务器上的奇怪的依赖项,例如DBUS和GTK。 因此,我正在寻求另一种从SVG生成PDF的方法,而不必在服务器上安装所有这些愚蠢的依赖项。 问题答案: 您考虑过svglib吗? 它

  • 问题内容: 我们有一段代码可以在我们的系统上生成一个zip文件。一切正常,但是有时该Zip文件在由FilZip或WinZip打开时被视为已损坏。 所以这是我的问题:我们如何以编程方式检查生成的zip文件是否损坏? 这是我们用于生成zip文件的代码: 我们在这里做错了什么吗? 编辑:实际上,上面的代码是绝对可以的。我的问题是我正在为用户重定向WRONG流。因此,与其打开一个zip文件,不如打开一个完

  • 问题内容: 我使用Eclipse在Windows 7中创建了一个jar文件。当我尝试打开jar文件时,它说jar文件无效或损坏。谁能建议我为什么jar文件无效? 问题答案: 当您在Windows资源管理器中双击一个JAR文件时,会发生这种情况,但是JAR本身实际上不是 可执行的 JAR。真正的可执行JAR至少应具有带有方法的类,并在中引用它。 在Eclispe中,您需要将项目导出为 Runnabl

  • 我试图使用ITextSharp旋转PDF文档中的各个页面。它看起来很有效,因为当我在土坯上打开时,一切看起来都很好。然而,当试图在itextSharp中重新打开时,会抛出各种异常。我可以看出文档出了问题,因为adobe总是问我是否要保存更改时,打开一个与itextSharp操纵的文档,这表明它修复了损坏。 疯狂的是,我甚至不必对文档进行任何操作,只需创建一个新的压模并关闭它。下面是代码,被剥离到仍