1

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

<...>
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
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 仅包含容器而不包含签名本身。

4

1 回答 1

0

仅包含图像的示例 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])屏幕上的签名小部件坐标即可。

于 2021-10-14T08:48:01.133 回答