我想在我的应用程序中使用 iText 2.1.7. 我把问题钉在了下面这段代码中:
InputStream inputFile = ...
OutputStream outputStream = ...
PdfReader pdfReader = new PdfReader(fis);
PdfStamper pdfStamper = new PdfStamper(pdfReader, os, '0', true);
pdfStamper.close();
pdfReader.close();
outputStream .close();
当输入我使用这个 pdf(这是波兰税收形式)时,此代码产生损坏的 pdf(错误 118)。你知道这个问题是否容易 work-around?我知道 c#/iTextSharp 中的相应代码有效。
**编辑:**这不是加密问题。我已经解决了这个问题。
1 回答
如评论所述,相关文档已加密以限制权限。因此,官方 iText 2.1.7 jar 中的代码在实例化 PdfStamper 时会抛出 BadPasswordException,因为未提供正确的密码。因此,它不会产生损坏的 PDF,因此这里的问题是不是错误.;)
据说当然可以强制 iText 2.1.7 忽略密码未提供的事实。在这种情况下,程序(在必要时更正了变量名称)确实产生了 Adobe Acrobat 拒绝打开的 PDF,显示错误代码 118。
另一方面,对当前的 iText 5.x 执行相同操作会生成 Adobe Acrobat 打开的文档,没有任何异议。
如果比较这两个输出,问题就变得清晰了。在 iText 2.1.7 的情况下,更新的信息字典如下所示:
用当前的 iText 5.x 看起来像这样:
因此,iText 2.1.7 不会加密更新的信息字典的条目,并且 Adobe Acrobat 在尝试解密时会收缩。
编辑
不幸的是,即使在将未加密的信息字典隔开之后,在尝试加载文件时仍有 118。因此,再次查看文件还有另一个区别:iText 2.1.7 创建的版本包含一个微小的对象流,而另一个版本则没有。 iText 在尝试读取该对象流时偶然发现...