1

我正在使用 iText 库来签署我的 PDF 文档。
我想知道 PdfStamper 中是否有任何方法可以管理外观的显示:一层中的签名信息和另一层中的图像,它们现在位于同一层中:

解决方案 :

            PdfStamper pdfStamper;
            pdfStamper = PdfStamper.createSignature(pdfReader, null, '\0',
                        outputFile);

            // appearance
            PdfSignatureAppearance appearance = pdfStamper
                        .getSignatureAppearance();
            appearance .setReason("Test");
            appearance .setLocation("Location");                                                                                                                                 
            appearance .setSignatureGraphic(Image.getInstance(RESOURCE)); 
            appearance.setRenderingMode(RenderingMode.GRAPHIC_AND_DESCRIPTION); appearance.setVisibleSignature(new Rectangle(420, 732, 512, 780), 1,"sign");

参考这本有趣的,我现在可以为描述和图形创建两个区域。

4

1 回答 1

1

请阅读PDF 文档的数字签名,第 2.4 节“创建不同的签名外观”。您将了解层 n0 到 n4,并发现自 2003 年以来不再推荐使用层 n1、n3 和 n4(换句话说:不要使用它们)。

您可以使用 n0 层,称为背景层,如下所示:

PdfTemplate n0 = appearance.getLayer(0);
float x = n0.getBoundingBox().getLeft();
float y = n0.getBoundingBox().getBottom();
float width = n0.getBoundingBox().getWidth();
float height = n0.getBoundingBox().getHeight();
n0.setColorFill(BaseColor.LIGHT_GRAY);
n0.rectangle(x, y, width, height);
n0.fill();

这只是书中的一个简单示例,绘制了一个浅灰色矩形。

您可以像这样使用 n2 层:

PdfTemplate n2 = appearance.getLayer(2);
ColumnText ct = new ColumnText(n2);
ct.setSimpleColumn(n2.getBoundingBox());
Paragraph p = new Paragraph("This document was signed by Bruno Specimen.");
ct.addElement(p);
ct.go();

如果“画文字”太难,还可以使用方便的方法,例如:

appearance.setLayer2Text("This document was signed by Bruno Specimen");
appearance.setLayer2Font(new Font(FontFamily.TIMES_ROMAN));

本书中的示例可在SourceForge 上找到。

使用上述方法,是创建外观的“硬方法”。还有不同的方法可以让 iText 完成工作:

屏幕截图数字签名书

于 2015-01-23T14:45:20.130 回答