使用PDFBox 2.0.25,过程文档获取签名字典,例pdf
try{
doc = PDDocument.load(inputFile);
doc.getSignatureDictionaries()
}catch(Exception e)
{
e.printStackTrace();
}由扫描的生产者生成的文件:
Foxit PhantomPDF Printer Version 6.1.0.0923行doc = PDDocument.load(inputFile);中的警告消息
Object (140:0) at offset 4039608 does not end with 'endobj' but with '0'然后得到行doc.getSignatureDictionaries();中的错误
java.lang.ClassCastException: org.apache.pdfbox.cos.COSInteger cannot be cast to org.apache.pdfbox.cos.COSDictionary
at org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm.getFields(PDAcroForm.java:378)
at org.apache.pdfbox.pdmodel.interactive.form.PDFieldTree$FieldIterator.<init>(PDFieldTree.java:79)
at org.apache.pdfbox.pdmodel.interactive.form.PDFieldTree$FieldIterator.<init>(PDFieldTree.java:68)
at org.apache.pdfbox.pdmodel.interactive.form.PDFieldTree.iterator(PDFieldTree.java:62)
at org.apache.pdfbox.pdmodel.PDDocument.getSignatureFields(PDDocument.java:932)
at org.apache.pdfbox.pdmodel.PDDocument.getSignatureDictionaries(PDDocument.java:952)为什么会发生这种事?这样的文件能被处理吗?
*更新:我尝试将maven repo Apache PDFBox 2.0.25替换为Apache PDFBox 2.0.26,但仍然得到相同的错误。
发布于 2022-09-19 12:37:59
基本问题是PDF.中的对象流中有一个错误。
根据PDF规范ISO 32000 (第1部分和第2部分),第7.5.7节-对象流-
对象流中的对象不应仅由对象引用组成。
但是@ by共享的示例文档在对象流中确实有这样的对象,特别是对象140的113 0 R、对象157的141 0 R和对象191的179 0 R。
由于对象流中禁止这些对象引用,许多PDF处理器将这些引用解析为以整数开头的唯一其他类型的对象,即数字对象。例如,对象140被解析为数字113,而不是对对象113的引用(该对象恰好是表单字段对象)。
因此,示例文档中的这些PDF处理器在数组中找到只能容纳表单字段对象的number对象。如果没有对这些处理器的表单字段读取进行防御性编程,您将得到类似于此处观察到的ClassCastException。
因此,,虽然PDFBox过去没有在这里进行防御性编程,但主要问题在于创建了当前PDF的PDF生成器。问题应该提交给他们。。
https://stackoverflow.com/questions/73740429
复制相似问题