Pdfbox подпись и защита без сохранения в файловой системе - PullRequest
0 голосов
/ 15 апреля 2019

Поддерживает ли pdfbox подписывание во время выполнения после создания и защиты pdf. В настоящее время я успешно загружаюсь из файловой системы и выполняю это.

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

public byte[] attachPdf(){
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    PDDocument doc = sign(generatedPdf());//generated pdf
    doc.save(byteArrayOutputStream);
    response = new ResponseEntity<>(byteArrayOutputStream.toByteArray(), headers, HttpStatus.OK);
    doc.close();
}


public PDDocument sign(PDDocument doc1){
        //FileOutputStream fos = new FileOutputStream(signFile);
        //PDDocument doc = PDDocument.load(inputFile, "*******");
        //doc.setAllSecurityToBeRemoved(true);

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        doc1.save(byteArrayOutputStream);
        PDDocument doc = PDDocument.load(byteArrayOutputStream.toByteArray());
        int accessPermissions = SigUtils.getMDPPermission(doc);

        PDSignature signature = null;
        PDRectangle rect = null;

        if (signature == null)
        {
            // create signature dictionary
            signature = new PDSignature();
        }

        if (rect == null)
        {
            rect = createSignatureRectangle(doc, humanRect);
        }
        signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
        signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);
        signature.setName("test");
        signature.setLocation("testL");
        signature.setReason("testR");
        signature.setSignDate(Calendar.getInstance());
        SignatureInterface signatureInterface = isExternalSigning() ? null : this;
        signatureOptions = new SignatureOptions();
        signatureOptions.setVisualSignature(createVisualSignatureTemplate(doc, doc.getNumberOfPages()-1, rect, signature));
        signatureOptions.setPage(doc.getNumberOfPages()-1);
        doc.addSignature(signature, signatureInterface, signatureOptions);
        //doc.save(baos);
        //doc.saveIncremental(fos);
        //IOUtils.closeQuietly(signatureOptions);
        return doc;
        }

1 Ответ

1 голос
/ 16 апреля 2019
  • Как предложено, изменено на новый ByteArrayOutputStream объект и используется метод saveIncremental заставил его работать. Фрагмент ниже.

public PDDocument sign(PDDocument doc1){
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
     doc1.save(byteArrayOutputStream);
     PDDocument doc = PDDocument.load(byteArrayOutputStream.toByteArray());
     int accessPermissions = SigUtils.getMDPPermission(doc);

     //sign doc here
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     doc.saveIncremental(baos);
     IOUtils.closeQuietly(signatureOptions);
     return baos.toByteArray();
}
...