Как управлять отображением цифровой подписи PDF?
Я использую библиотеку 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");
Ссылаясь на эту интересную книгу, теперь я могу создать две области для описания и графики.
1 ответ
Пожалуйста, прочитайте Цифровые подписи для документов PDF, раздел 2.4 "Создание различных подписей". Вы узнаете о слоях с n0 по n4 и обнаружите, что использование слоев n1, n3 и n4 больше не рекомендуется с 2003 года (другими словами: не используйте их).
Вы можете использовать слой 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();
Это простой пример из книги, нарисованный светло-серым прямоугольником.
Вы можете использовать слой n 2 следующим образом:
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 выполнять свою работу: