使用iText损坏pdf文档

时间:2014-02-23 10:25:35

标签: android adobe itext

如果有人可以提供帮助,我在安卓和iText方面遇到了一些问题。

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

我遇到的问题是Android adobe pdf阅读器显示文档很好,正是我正在寻找的。然而,当我在我的电脑上打开一个窗口来访问平板电脑上的/ mnt / sdcard文件夹,创建文件的地方,并在我的电脑上使用Adobe阅读器,adobe reader X打开文档时,会收到一条消息说 打开此文档时出错。文件已损坏,无法修复。

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

iText和Adobe 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");

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

3 个答案:

答案 0 :(得分:1)

在平板电脑上查看文档时,将平板电脑上文档的文件大小(对于SO来说太大了)与文件大小进行比较。您在自己网站上共享的文件不是完整的PDF文件。它看起来好像是在任意地方切成两半。也许你没有完全复制它,或者文件大小有一些限制。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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