Согласно пояснениям в комментариях к вопросу, вы пытаетесь расположить подпись прямо под ограничительной рамкой существующего содержимого последней страницы документа.
Чтобы определить эту ограничивающую рамку, вы можете использовать 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.