Как применить изображение цифровой подписи внизу слева на последней странице pdf, используя pdfbox? - PullRequest
0 голосов
/ 17 октября 2019

заголовок говорит сам за себя, я могу визуально подписать pdf, используя pdfbox версии 2.0.8. В настоящее время я должен жестко закодировать начальную координацию изображения в коде. но, поскольку PDF-файлы меняются, положение изображения всегда необходимо менять соответствующим образом. Я хочу применить изображение подписи в конце PDF в левом углу. как мне получить эту позицию в коде? вот мой код, жесткие координаты кодирования с использованием _x & _y. В коде «подпись» виден объект подписи, а «страница» - последняя страница pdf, «args [2]» - это pdf-файл для подписи:

int _x = 30;
int _y = 420;
signing.setVisibleSignDesigner(args[2], _x, _y, -50, imageStream, page);
imageStream.close();
signing.setExternalSigning(externalSig);
signing.signPDF(documentFile, signedDocumentFile, tsaClient);
removeFile(imageResult);

Пример подписи, которую я хочу:

Example of Signature I want

Редактировать: добавлено изображение, чтобы пояснить, что поле подписи должно быть в конце документа, а не в конце последней страницы. Документ может быть заполнен в верхней части последней страницы, поэтому поле также должно быть сразу после текста, а не в конце страницы. извините, я не совсем понял свой вопрос раньше.

1 Ответ

1 голос
/ 01 ноября 2019

Согласно пояснениям в комментариях к вопросу, вы пытаетесь расположить подпись прямо под ограничительной рамкой существующего содержимого последней страницы документа.

Чтобы определить эту ограничивающую рамку, вы можете использовать BoundingBoxFinder представлен в этом ответе .

Но, как вы узнали в ответ на комментарий по этому поводу, вы не можете просто использовать его результат в качестве входных данных для CreateVisibleSignature.setVisibleSignDesignerтак как предполагаются разные системы координат:

  • BoundingBoxFinder использует координаты пространства пользователя по умолчанию в PDF для рассматриваемой страницы: они задаются MediaBox рассматриваемой страницыи их y координаты увеличиваются вверх. Обычно начало координат находится в левом нижнем углу страницы.
  • CreateVisibleSignature, с другой стороны, использует систему координат с той же длиной единицы, но имеющую начало координат в верхнем левом углу страницы, и y координаты увеличиваются вниз.

Таким образом, координаты должны быть преобразованы, например, так:

File documentFile = new File(SOURCE);
File signedDocumentFile = new File(RESULT);

Rectangle2D boundingBox;
PDRectangle mediaBox;
try (   PDDocument document = PDDocument.load(documentFile) ) {
    PDPage pdPage = document.getPage(0);
    BoundingBoxFinder boundingBoxFinder = new BoundingBoxFinder(pdPage);
    boundingBoxFinder.processPage(pdPage);
    boundingBox = boundingBoxFinder.getBoundingBox();
    mediaBox = pdPage.getMediaBox();
}

CreateVisibleSignature signing = new CreateVisibleSignature(ks, PASSWORD.clone());
try (   InputStream imageStream = IMAGE_STREAM) {
    signing.setVisibleSignDesigner(documentFile.getPath(), (int)boundingBox.getX(), (int)(mediaBox.getUpperRightY() - boundingBox.getY()), -50, imageStream, 1);
}
signing.setVisibleSignatureProperties("name", "location", "Security", 0, 1, true);
signing.setExternalSigning(false);
signing.signPDF(documentFile, signedDocumentFile, null);

( CreateSignature test signLikeHemantPdfTest)

Замечания

Я нашел документ, похожий на ваш тестовый файл PDF для обучения в Юконе здесь . Применяя приведенный выше код к этому файлу, можно заметить небольшой разрыв между последней видимой строкой текста и изображением. Этот пробел вызван пробелами в строке ниже строки «Пожалуйста, посетите наш веб-сайт». BoundingBoxFinder не проверяет, приводит ли инструкция рисования в конечном итоге к чему-либо видимому, он всегда добавляет соответствующую область в ограничивающую рамку.

В общем случае вы можете вычесть небольшой бит из y координата, вычисленная с помощью приведенного выше кода, чтобы создать визуальный разрыв между прежним содержимым страницы и новым виджетом подписи.

Изучая источники CreateVisibleSignature, можно увидеть, что на самом деле y координаты преобразуются путем вычитания их из высоты MediaBox , а не из значения верхней границы . В конечном итоге эти координаты копируются в целевой документ. Таким образом, может оказаться необходимым использовать mediaBox.getHeight() вместо mediaBox.getUpperRightY() в приведенном выше коде.

Изучая источники CreateVisibleSignature2, можно увидеть, что на самом деле CropBox используется вместо MediaBox . Если ваш код основан на этом примере, вам, возможно, придется заменить pdPage.getMediaBox() на pdPage.getCropBox() в приведенном выше коде.

Как правило, это произвольное использование различных систем координат является одним из довольно немногих источников раздражения, когдаработа с PDFBox.

...