itext5 签署仅包含图像的 PDF

itext5 sign PDF containing only image

我有一个代码可以成功地将可见签名块添加到“普通”PDF 中。

<...>
PdfStamper stamper = PdfStamper.createSignature(reader, os, '[=10=]');
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setVisibleSignature(new Rectangle(c[0], c[1], c[2], c[3]), 1, field);
createVisigbleSignature(stamper, appearance, signFont, signTxt, img);
<...>
public static void createVisigbleSignature(PdfStamper stamper, PdfSignatureAppearance appearance, Font font, String text, byte[] img) throws Exception {
        PdfTemplate layer2 = appearance.getLayer(2);
        float size = -1;
        final float MARGIN = 2;
        Rectangle dataRect = new Rectangle(MARGIN, MARGIN, appearance.getRect().getWidth() - MARGIN, appearance.getRect().getHeight() - MARGIN);
        Rectangle sr = new Rectangle(dataRect.getWidth(), dataRect.getHeight());
        size = ColumnText.fitText(font, text, sr, 12, appearance.getRunDirection());
        ColumnText ct = new ColumnText(layer2);
        ct.setRunDirection(appearance.getRunDirection());
        ct.setSimpleColumn(new Phrase(text, font), dataRect.getLeft(), dataRect.getBottom(), dataRect.getRight(), dataRect.getTop(), size, Element.ALIGN_LEFT);
        ct.go();
        //image
        Image image = Image.getInstance(img);
        layer2.addImage(image, appearance.getRect().getWidth(), 0, 0, appearance.getRect().getHeight(), 0, 0);
}

但是如果我尝试对仅包含图像的 PDF 签名(基本上它是导出为 pdf 的图像),我的可见签名块将不再可见。 Acrobate Reader 可以看到签名容器,但用户无法看到或单击“可见”块。

这可能是什么原因以及如何确保签名信息在任何情况下都可见?

示例如下:

https://drive.google.com/drive/folders/1hnROu5UVXECi-hy9FY5ZXJLDK_jdwjch?usp=sharing normal.pdf和photo.pdf是签名前的文件。 normal_pre.pdf 和 photo.pre.pdf 是预签名的。

该标志将被视为“损坏”。这是正常的,因为 pdf 仅包含容器而不包含签名本身。

仅包含图像的示例 PDF 的问题在于您将签名放置在页外。

详细信息:该 PDF 有一个页面带有此裁剪框:

/CropBox [ 0.0 0.0 841.5 594.75 ] 

即它的左下角是坐标系原点(0, 0),右上角是(841.5, 594.75)。

不过,您在该页面上的签名位于

/Rect[10 810 130 840]

即在 (10, 810) 和 (130, 840) 之间。这些坐标显然在裁剪框上方。

如果你设置 Adob​​e Reader 连续显示页面并缩小一点,你实际上可以看到注释:

因此,要解决此问题,只需为屏幕上的签名小部件使用坐标 new Rectangle(c[0], c[1], c[2], c[3])