PDFBOX - подписать AcroForm PDSignatureField - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть существующий AcroForm, который я хочу подписать, используя PDSignatureField. Я не могу найти метод, в котором я устанавливаю значение (растровое изображение) поля.

SetValue ожидает объект PDSignature, но у этого объекта нет метода для установки растрового изображения.

val signature = PDSignature()
signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED)
signature.setContents(image)

acroForm?.isSignaturesExist = true
acroForm?.isAppendOnly = true

val treeNode = acroForm?.getField(fieldName) as PDSignatureField
treeNode.value = signature

Я пытался установить setContents с помощью bimtap byteArray, но безрезультатно.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вот как я реализовал это для некоторых моих тестов:

public void signVisible() throws Exception{
    KeyStore keystore = KeyStore.getInstance("PKCS12");
    keystore.load(new FileInputStream("YourKeystore.p12"),"PWD".toCharArray());

    File documentFile = new File("ThePdfYouWantToSign.pdf");

    CreateVisibleSignature signing = new CreateVisibleSignature(keystore,"PWD".toCharArray());
    FileInputStream imageStream = new FileInputStream("YourSignatureImage.png");
    File signedDocumentFile = new File("TheSignedFile.pdf");

    signing.setVisibleSignDesigner(-85, imageStream);
    imageStream.close();
    signing.setVisibleSignatureProperties("name", "location", "Security", true);
    signing.setExternalSigning(false);

    signing.signPDF(documentFile, signedDocumentFile, null,"SignatureFieldName");
}
0 голосов
/ 07 ноября 2018

Вам лучше взглянуть на официальный пример кода PDFBox для создания цифровых подписей PDF, например, CreateVisibleSignature2.java .

В частности, вы увидите, что изображение не вводится напрямую в PDSignature, а вместо этого встроено в аннотацию в шаблоне PDF:

// create a template PDF document with empty signature and return it as a stream.
private InputStream createVisualSignatureTemplate(PDDocument srcDoc, int pageNum, PDRectangle rect) throws IOException
{
    try (PDDocument doc = new PDDocument())
    {
        [...]

        try (PDPageContentStream cs = new PDPageContentStream(doc, appearanceStream))
        {
            [...]
            cs.saveGraphicsState();
            cs.transform(Matrix.getScaleInstance(0.25f, 0.25f));
            PDImageXObject img = PDImageXObject.createFromFileByExtension(imageFile, doc);
            cs.drawImage(img, 0, 0);
            cs.restoreGraphicsState();
            [...]
        }

        // no need to set annotations and /P entry

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        doc.save(baos);
        return new ByteArrayInputStream(baos.toByteArray());
    }
}

Этот шаблон PDF, который используется при подписании:

public void signPDF(File inputFile, File signedFile, Rectangle2D humanRect, String tsaUrl, String signatureFieldName) throws IOException
{
    [...]

        signatureOptions = new SignatureOptions();
        signatureOptions.setVisualSignature(createVisualSignatureTemplate(doc, 0, rect));
        signatureOptions.setPage(0);
        doc.addSignature(signature, signatureInterface, signatureOptions);

    [...]
}
...