pdftex 1.40.13 是否输出格式错误的 pdf?

pdftex 1.40.13 是否输出格式错误的 pdf?

我有几个现有的项目,它们在 pdftex 1.40.10 之前的版本上产生了有效的 pdf 输出。现在使用 1.40.13 版本,我得到的 pdf 文件被 iText 库抱怨为格式错误。我的问题是我是否正确地分析了情况,以及错误是否出现在 pdftex 或 iText 中。

下面演示了两个系统上的行为差异,一个系统使用旧版本,另一个系统使用新版本。pdftk 实用程序使用 iText 库解析 pdf:

|||| LM  me $ pdflatex --version | head -1
pdfTeX 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian)
|||| LM  me $ pdflatex -shell-escape -interaction=nonstopmode me >/dev/null
|||| LM  me $ pdftk me.pdf cat output /dev/null
|||| LM  me $ 

---- rintintin me $ pdflatex --version | head -1
pdfTeX 3.1415926-2.4-1.40.13 (TeX Live 2012/Debian)
---- rintintin me $ pdflatex -shell-escape -interaction=nonstopmode me >/dev/null
---- rintintin me $ pdftk me.pdf cat output /dev/null
Error: Failed to open PDF file: 
   me.pdf
Errors encountered.  No output created.
Done.  Input errors, so no output created.

这是具有相同(新同步)的源文件。

我的所有项目都不会发生这种情况,例如,我无法使用简单的“hello,world”文档生成它。我已在此处发布了生成错误的文件 me.pdf:http://www.lightandmatter.com/pdftk_bug/

Pdftk 不会报告错误类型,但可以通过从命令行调用 iText 工具来找出错误原因:

---- rintintin me $ java -cp /usr/share/java/itext1-1.4.jar com.lowagie.tools.plugins.InspectPDF me.pdf
trailer not found.

旧版本的 pdftex 输出 pdf 1.4,新版本输出 pdf 1.5。iText 库应该能够处理最高 1.6 版本的 pdf。

在文本编辑器中检查这两个 pdf 文件的结尾,尾部似乎确实存在明显差异:

旧版本的PDF输出:

trailer
<< /Size 3577
/Root 3575 0 R
/Info 3576 0 R
/ID [<F3E9A772E7220505119484B4C1B5059E> <F3E9A772E7220505119484B4C1B5059E>] >>
startxref
38327286
%%EOF

新版本输出的PDF:

3499 0 obj <<
/Type /XRef
/Index [0 3500]
/Size 3500
/W [1 4 1]
/Root 3497 0 R
/Info 3498 0 R
/ID [<B51C8DB4F9B12A880DBBE0625164918E> <B51C8DB4F9B12A880DBBE0625164918E>]
/Length 9886
/Filter /FlateDecode
>>
stream
x\3325\234w|\224U\376\2663!\275@z#      !!=\201\220\204^D\222^PR\200\320^RJ^R\322CHDAW]u-\253^B
...lots of binary data snipped for brevity...
w*\374;\233\344\231A\367H\230^?6\3120\233\356t\230\303^C\246\317c^E\362\314\213;^S\346\343\307d\230G7\223\353fr\335$
endstream
endobj
startxref
37919910
%%EOF

倒数第二行应该是交叉引用部分的字节偏移量。

|||| LM  me $ od -a -j 38327286 me.pdf | head -1
222151766   x   r   e   f  nl   0  sp   3   5   7   7  nl   0   0   0   0

---- rintintin me $ od -a -j 37919910 me.pdf | head -1
220516246   3   4   9   9  sp   0  sp   o   b   j  sp   <   <  nl   /   T

在旧版本的输出中,字节偏移指向字符串“xref”,这似乎是正确的。在新版本的输出中,它指向看起来不同的东西,也许是 pdf 1.5 中使用的新样式的 xref?当我使用新版 pdftex 编译一个简单的“hello, world”文档时,它的格式看起来与此类似,但 iText 不会因此而卡住。

我没有深入研究 pdf 规范或 iText 的源代码,所以我不知道这是否真的是格式错误的 pdf,或者它是否是有效的 pdf 1.5,只是 iText 不接受。Ghostscript 和 poppler 都毫无怨言地接受了该文件。

答案1

pdf您在线发布的是完全有效的 PDF 1.5 - Adob​​e Acrobar X Preflight 就是这么认为的。 Acrobat X 预检

从...开始PDF 1.5,PDF 可以包含压缩对象流。请更新您的 pdftk 版本或提交错误跟他们

答案2

使用的 iText 版本可以追溯到 2006 年。请参阅http://itextpdf.com/history/?branch=10&node=14

使用最新版本的 iText 可以毫无问题地读取该文件。其他答案清楚地表明,PDF 文件中存在错误的假设是错误的。

要么你遇到了旧版本的 iText 中的错误(请阅读http://lowagie.com/itext2了解更多信息),或者 PDF 中某些内容当时可能不受 iText 支持。

例如:我看到 PDF 使用压缩的 XRef 表。我知道某些 PdfTk 版本在处理此类文件时存在问题。请注意,PdfTk 仅仅是 iText 的包装器,由与 iText 组没有任何关联的人制作。

很遗憾你没有去打扰那个人,而是去打扰 TeX 和 iText 的人。你应该一直这样做 ;-)

相关内容