PDFBox 2.0.8 проблема при подписании документа - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь подписать PDF, используя этот метод, но получаю документ без размера:

public static void sign(PDDocument doc) throws KeyStoreException, NoSuchAlgorithmException, CertificateException,
        IOException, UnrecoverableKeyException {
    System.out.println("Document pages ? " + doc.getNumberOfPages());
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
    ks.load(VisibleSignature.class.getResourceAsStream(CERT_FILE), ALIAS_PASS);
    System.out.println("KeyStore is null ? " + (ks == null));
    VisibleSignature vs = new VisibleSignature(ks, ALIAS_PASS.clone());
    InputStream is = Resource.get(IMAGE_FILE);
    int page = 1;
    vs.setVisibleSignDesigner(doc, 0, 0, -50, is, page);
    is.close();
    vs.setVisibleSignatureProperties("Test", "Test", "Test", 0, page, true);
    PDSignature signature = new PDSignature();
    PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();
    System.out.println("Acroform is null ? " + (acroForm == null));
    System.out.println("Acroform getNeedAppearances ? " + (acroForm.getNeedAppearances()));
    if (acroForm != null && acroForm.getNeedAppearances())
        if (acroForm.getFields().isEmpty())
            acroForm.getCOSObject().removeItem(COSName.NEED_APPEARANCES);
        else
            System.out.println("/NeedAppearances is set, signature may be ignored by Adobe Reader");
    signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
    signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
    if (vs.visibleSignatureProperties != null) {
        vs.visibleSignatureProperties.buildSignature();
        signature.setName(vs.visibleSignatureProperties.getSignerName());
        signature.setLocation(vs.visibleSignatureProperties.getSignerLocation());
        signature.setReason(vs.visibleSignatureProperties.getSignatureReason());
        System.out.println("SignerName " + vs.visibleSignatureProperties.getSignerName());
    }
    signature.setSignDate(Calendar.getInstance());
    vs.signatureOptions = new SignatureOptions();
    vs.signatureOptions.setVisualSignature(vs.visibleSignatureProperties.getVisibleSignature());
    vs.signatureOptions.setPage(vs.visibleSignatureProperties.getPage() - 1);
    doc.addSignature(signature, vs.signatureOptions);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    doc.saveIncremental(baos);
    doc.close();
    IOUtils.closeQuietly(vs.signatureOptions);
    byte[] content = baos.toByteArray();
    System.out.println("Content length: >>>>>>>>>>>>>>>>>>> " + content.length);
}

И вот что я получаю в журнале затмений:

18: 50: 25,702 Стандартный вывод INFO [default task-14] - Страницы документа? 1

18: 50: 25,740 ИНФОРМАЦИЯ [стандартный задание-14] стандартный вывод - KeyStore имеет значение null? ложь

18: 50: 25,779 ИНФОРМАЦИЯ [стандартный задание-14] стандартный вывод - Acroform is null? ложь

18: 50: 25,780 ИНФОРМАЦИЯ [стандартный задание-14] стандартный вывод - Acroform getNeedAppearances? ложь

18: 50: 25,782 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - структура PDF создана

18: 50: 25,782 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDFTemplateCreator - начато построение PDF

18: 50: 25,782 INFO [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Создан массив ProcSet

18: 50: 25,782 INFO [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - страница PDF создана

18: 50: 25,783 INFO [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - AcroForm создан

18: 50: 25,788 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Поле подписи создано

18: 50: 25,788 INFO [задание по умолчанию 14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - PDSignature была создана

18: 50: 25,788 INFO [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - словарь AcroForm создан

18: 50: 25,789 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Матрица была добавлена ​​

18: 50: 25,792 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Создан прямоугольник подписи

18: 50: 25,793 INFO [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Создан прямоугольник форматера

18: 50: 25,815 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - изображение видимой подписи создано

18: 50: 25,815 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Создан поток формы держателя

18: 50: 25,816 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Созданы ресурсы формы держателя

18: 50: 25,816 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Создана форма держателя

18: 50: 25,816 INFO [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - словарь для создания PDF-файлов создан

18: 50: 25,817 INFO [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - создан поток другой формы (внутренняя форма - она ​​будет внутри формы-держателя)

18: 50: 25,817 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - созданы ресурсы другой формы (внутренняя форма - она ​​будет внутри формы-держателя)

18: 50: 25,817 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - создана другая форма (внутренняя форма - она ​​будет внутри формы держателя)

18: 50: 25,817 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - теперь вставленная внутренняя форма внутри формы держателя

18: 50: 25,817 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Поток формы созданного изображения

18: 50: 25,817 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - ресурсы формы созданного изображения

18: 50: 25,818 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Форма созданного изображения

18: 50: 25,818 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Созданная форма фонового слоя

18: 50: 25,818 INFO [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - вставленный ProcSet в PDF

18: 50: 25,818 INFO [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Внедренный поток представления в pdf

18: 50: 25,818 ИНФОРМАЦИЯ [задание по умолчанию 14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - Создана видимая подпись

18: 50: 25,819 INFO [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigBuilder - WidgetDictionary был создан

18: 50: 25,825 DEBUG [задание по умолчанию-14] org.apache.pdfbox.cos.COSStream - Создает InputStream, вызываемый без записи данных в поток.

18: 50: 25,825 ИНФОРМАЦИЯ [задание по умолчанию-14] org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDFTemplateCreator - начался возврат потока, размер = 21301

18: 50: 25 825 стандартный вывод [INFO Task-14] - SignerName Test

18: 50: 25 857 stdout INFO [default task-14] - длина содержимого: >>>>>>>>>>>>>>>>>> 0

Кто-нибудь знает, что здесь происходит?

1 Ответ

0 голосов
/ 09 мая 2018

В вашем коде вы не предоставляете документу реализацию SignatureInterface, которую он может использовать для подписи. Не учитывая, что в этом случае использования PDFBox предполагает, что вы создадите подпись извне (для примера посмотрите на оригинальный CreateVisibleSignature метод sign). В этом случае результат записывается в выходной поток после установки подписи с использованием метода ExternalSigningSupport setSignature. Поскольку вы этого не делаете, ваш ByteArrayOutputStream baos остается пустым.

Но у вас есть экземпляр SignatureInterface, который вы уже инициализировали сертификатом и материалом ключа: ваш VisibleSignature vs. Таким образом, я предполагаю, что вы не предоставили SignatureInterface не сделано специально.

Таким образом, для обеспечения SignatureInterface необходимо использовать перегрузку PDDocument.addSignature с параметром SignatureInterface. Например. заменить ваш звонок

doc.addSignature(signature, vs.signatureOptions);

от

doc.addSignature(signature, vs, vs.signatureOptions);

делает ваш код работающим так, как вам нужно.

...