pdfbox-添加可视签名。同向对象投射错误

pdfbox-添加可视签名。同向对象投射错误,pdf,adobe,pdf-generation,digital-signature,pdfbox,Pdf,Adobe,Pdf Generation,Digital Signature,Pdfbox,在org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureOptions中有setVisualSignature方法。我可以从其他具有可视签名外观的pdf流中创建可视签名(以复制外观) 1) 我创建了一个签名外观pdf,并使用setVisualSignature()方法复制了可视签名一切正常 2) 我从PDFBox更改视觉签名(更改图像)。要获取COSObject,请执行以下操作: Iterator<Entry<

org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureOptions
中有
setVisualSignature
方法。我可以从其他具有可视签名外观的pdf流中创建可视签名(以复制外观)

1) 我创建了一个签名外观pdf,并使用
setVisualSignature()
方法复制了可视签名一切正常

2) 我从PDFBox更改视觉签名(更改图像)。要获取COSObject,请执行以下操作:

Iterator<Entry<COSObjectKey, Long>> xrefEntriesIt = doc.getDocument()
        .getXrefTable().entrySet().iterator();
while (xrefEntriesIt.hasNext()) {
    COSObject object = doc.getDocument().getObjectFromPool(
            xrefEntriesIt.next().getKey());
    if (object.getDictionaryObject(COSName.SUBTYPE) == COSName.IMAGE) {
        changeImage(object, doc);
    }
}
一切正常。

3) 当我用新的pdf和新的外观图像(我用代码更改)调用
setVisualSignature()
方法时,我有一个错误:

线程“main”java.lang.ClassCastException中的异常: 无法将org.apache.pdfbox.cos.COSObject强制转换为 org.apache.pdfbox.cos.cosdirectionary位于 org.apache.pdfbox.pdmodel.PDDocument.addSignature(PDDocument.java:474)

那是


会发生什么?我是否错误地更改了图像?

模板.pdf和
更改的模板.pdf
之间的区别在于前者中的签名字段字典包含其外观流字典作为直接对象:

9 0 obj
<< [...] /AP<</N 8 0 R>>>>
endobj
因此,这里的PDFBox期望/AP值是直接字典对象,而不是间接字典对象的引用

我假设您的第一次操作使PDFBox以它认为最好的方式重写PDF(这似乎包括制作字典间接对象),然后PDFBox还有其他期望


如果您将第一次操作作为增量更新而不是完全重写,PDFBox可能会保持外观字典不变。

迟做总比不做好,这将在1.8.10中得到修复,请参阅PDFBox-2767。
9 0 obj
<< [...] /AP<</N 8 0 R>>>>
endobj
5 0 obj
<<
[...]
/AP 10 0 R
>>
[...]
10 0 obj
<<
/N 15 0 R
>>
PDAppearanceDictionary ap = 
    new PDAppearanceDictionary((COSDictionary)cosBaseDict.getItem(COSName.AP));