如何管理 PDF 数字签名的显示?

How to manage a PDF digital signature's display?

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

解法:

            PdfStamper pdfStamper;
            pdfStamper = PdfStamper.createSignature(pdfReader, null, '[=10=]',
                        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");

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

请阅读 Digital Signatures for PDF documents,第 2.4 节 "Creating different signature appearances." 您将了解层 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();

如果"drawing text"太难,也可以使用方便的方法如:

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

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

使用以上方法,正在创建外观"the hard way"。还有不同的方法让 iText 完成工作: