【问题标题】:pdfbox - add visual signature. COSObject cast errorpdfbox - 添加视觉签名。 COSObject 转换错误
【发布时间】:2013-07-03 16:05:45
【问题描述】:

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);
    }
}

并改变图像:

private static void changeImage(COSObject obj, PDDocument doc) {

    PDXObjectImage imageInPdf =
        (PDXObjectImage) PDXObject.createXObject((COSStream) obj.getObject());

    File inputFile = new File("/new_SIGNATURE_IMG.jpg");
    PDXObjectImage newImage = new PDJpeg(doc, new FileInputStream(inputFile));
    imageInPdf.getCOSStream().replaceWithStream(newImage.getCOSStream());
    doc.save("/new.pdf");
}

一切正常。

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

线程“主”java.lang.ClassCastException 中的异常: org.apache.pdfbox.cos.COSObject 无法转换为 org.apache.pdfbox.cos.COS字典在 org.apache.pdfbox.pdmodel.PDDocument.addSignature(PDDocument.java:474)

那是samples

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

【问题讨论】:

  • 迟到总比不到好,这将在 1.8.10 中修复,请参阅 PDFBOX-2767。

标签: pdf adobe pdf-generation digital-signature pdfbox


【解决方案1】:

template.pdfCHANGED_TEMPLATE.pdf的区别在于前者的签名字段字典包含其外观流字典作为直接对象:

9 0 obj
<< [...] /AP<</N 8 0 R>>>>
endobj

而在后者中,外观流字典是仅从签名字段字典中引用的间接对象:

5 0 obj
<<
[...]
/AP 10 0 R
>>
[...]
10 0 obj
<<
/N 15 0 R
>>

这完全没问题,PDF规范一般不要求它是直接的:

AP 字典 (可选;PDF 1.2) 外观字典,指定注释应如何在页面上以可视方式呈现(请参阅 12.5.5,“外观流”) .个别注释处理程序可能会忽略此条目并提供自己的外观。

ISO 32000-1:2008 中的表 164)

不幸的是,发生异常的代码,即第 474 行中的 PDDocument 方法 addSignature`,如下所示:

PDAppearanceDictionary ap = 
    new PDAppearanceDictionary((COSDictionary)cosBaseDict.getItem(COSName.AP));

因此,这里的 PDFBox 期望 /AP 值是直接字典对象,而不是对间接字典对象的引用。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2023-02-06
    相关资源
    最近更新 更多