iText的pdf文档已损坏



如果有人能帮忙,我在android和iText方面遇到了一些问题。

安卓应用程序编写多个页面,每个页面包含不同的表。我不允许一个表跨越一个页面,而是为每个页面添加一个表,并为下一个页面创建一个新表。这样我就可以保留对页面总计、页眉和页脚的控制。

我遇到的问题是安卓adobe pdf阅读器显示文档很好,这正是我想要的。然而,当我在电脑上打开一个窗口,访问平板电脑上创建文件的/mnt/sdcard文件夹,并用电脑上的Adobe阅读器Adobe阅读器X打开文档时,会收到一条消息,上面写着打开此文档时出错。文件已损坏,无法修复。

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

iText和Adobe X.是否存在已知问题

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

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

感谢的帮助

Pete


我试图用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");

这似乎是正确的轨道吗。如果是,我该如何停止流自动关闭?

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

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

一旦你发现是什么原因导致你的PDF被截断到8465字节,你就解决了你的问题。如果你说PDF在你的平板电脑上显示正确,罪魁祸首不会是iText。

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

为了确保流得到正确管理,您可能需要尝试将它们转换为资源块。当你这样做时,当你到达街区的尽头时,它们会自动关闭,但在手动关闭之前,它们会一直打开。类似这样的东西:

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

最新更新