【问题标题】:Corrupt pdf document with iText使用 iText 损坏 pdf 文档
【发布时间】:2014-03-24 21:24:11
【问题描述】:

如果有人可以帮忙,我在使用 android 和 iText 时遇到了一些问题。

android 应用程序编写多个页面,每个页面包含不同的表。我没有让表格跨越页面,而是为每个页面添加一个表格并为下一页创建一个新表格。这样我就可以控制页面总数以及页眉和页脚。

我遇到的问题是 Android adobe pdf 阅读器可以很好地显示文档,这正是我正在寻找的。但是,当我在我的电脑上打开一个窗口以访问平板电脑上的 /mnt/sdcard 文件夹(创建文件的位置)并使用我的电脑上的 Adob​​e 阅读器 adobe reader X 打开文档时,收到一条消息说 打开此文档时出错。文件已损坏,无法修复。

这非常令人沮丧,我确信正在向表中添加正确数量的列。我确实经常使用 colspan 和 rowspan。不确定这是否与它有关。如果我跳过文档的主要部分,它似乎工作正常。

iText 和 Adob​​e X 是否存在已知问题。

我根本没有完成表格,只是使用 document.add(table),但我确实关闭了文档。 doc.close().

我也尝试过复制到我的桌面,但没有区别

感谢您的帮助

皮特


我尝试使用 iText PDFReader 类重新打开文档并收到以下错误。

Rebuild failed: trailer not found.; Original message: PDF startxref not found.

经过调查,输出流似乎关闭得太早了,虽然我不确定为什么它应该显示在平板电脑上。也许它以某种方式连接文档。如图所示打开流

Document document = new Document(PageSize.A4.rotate());
PdfWriter.getInstance(document, new FileOutputStream(Const.PDF_PATH+FILE));
document.open();
document.addTitle("Pilot Flight Logbook");
document.addSubject("Log of all Flights");
document.addKeywords("Java, PDF, iText");
document.addAuthor("ProPilot");
document.addCreator("ProPilot");

这似乎是正确的轨道。如果是这样,我怎样才能停止自动关闭流?

【问题讨论】:

标签: android adobe itext


【解决方案1】:

将平板电脑上文档的文件大小(您发现它对于 SO 来说太大了)与在计算机上查看时的文件大小进行比较。您在网站上共享的文件不是完整的 PDF。它看起来好像在任意位置被切成两半。可能是你没有完全复制,或者文件大小有一些限制。

无论如何:我在 Notepad++ 中打开了您的 PDF 并滚动到最后。每个 PDF 都应以 %%EOF 结尾。您的结束于流对象内的任意位置(流对象通常以关键字endstream 结尾)。

找到导致 PDF 被截断为 8,465 字节的原因后,您的问题就解决了。如果您说 PDF 在平板电脑上正确显示,那么罪魁祸首就不是 iText。

【讨论】:

  • 一点更新。似乎如果我关闭平板电脑并重新启动它,然后从 PC 打开文档,它就可以正常工作。因此,当我使用 doc.close() 时,它实际上并没有刷新和最终确定文档。 Android中有没有办法强制完成文件。我想这就是为什么它在表格 PDF 阅读器中工作的原因,它以某种方式从其内存缓冲区中获取文档的其余部分。有什么想法,请帮忙。
【解决方案2】:

我遇到了这个错误(iText7,Acrobat 11 生成的可填充 PDF),解决方案是在 Acrobat Pro 中打开 PDF,通过优化器工具运行它,去除不必要的属性,将文件从 PDF v1.7 降级到v1.5,去除压缩。只有这样,Adobe Reader 才能打开经过 iText7 修改/盖章的 PDF。

【讨论】:

    【解决方案3】:

    为确保正确管理流,您可能需要尝试将它们转换为使用资源块。当您这样做时,它们会在您到达块的末尾时自动关闭,否则将保持打开状态,直到您手动关闭它们。像这样的:

    try (OutputStream oStream = new FileOutputStream(Const.PDF_PATH+FILE)) {
        Document document = new Document(PageSize.A4.rotate());
        PdfWriter.getInstance(document, oStream);
        document.open();
        document.addTitle("Pilot Flight Logbook");
        document.addSubject("Log of all Flights");
        document.addKeywords("Java, PDF, iText");
        document.addAuthor("ProPilot");
        document.addCreator("ProPilot");
        < DO MORE STUFF>
    } // your stream will close here
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      相关资源
      最近更新 更多