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) 之间。这些坐标显然在裁剪框上方。
如果你设置 Adobe Reader 连续显示页面并缩小一点,你实际上可以看到注释:
因此,要解决此问题,只需为屏幕上的签名小部件使用坐标 new Rectangle(c[0], c[1], c[2], c[3])
。
我有一个代码可以成功地将可见签名块添加到“普通”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) 之间。这些坐标显然在裁剪框上方。
如果你设置 Adobe Reader 连续显示页面并缩小一点,你实际上可以看到注释:
因此,要解决此问题,只需为屏幕上的签名小部件使用坐标 new Rectangle(c[0], c[1], c[2], c[3])
。