首页 > 解决方案 > 无需保存在文件系统中的 Pdfbox 签名和保护

问题描述

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;
        }

标签: javaencryptionpdfboxsignature

解决方案


  • As suggested changed to new ByteArrayOutputStream object and used saveIncremental method made it work. Snippet below.

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();
}

推荐阅读