java - 无需保存在文件系统中的 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;
}
解决方案
- 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();
}
推荐阅读
- c# - 计算一段时间内每小时的每小时分钟数
- android - Android_ID (SSAID) 用于跟踪 Android 10 及更高版本的设备
- android - Flutter Always 后台服务
- c# - 从 UWP 应用程序打印时如何以编程方式设置打印选项?
- javascript - 从下拉列表中选择选项并使用 javascript 在表格单元格中显示
- nginx - dmz 中的 nginx 反向代理,带有用于公共互联网的 NAT
- css - 仅将“悬停”框阴影应用于容器
- shell - shell 将 awk 拆分为数组
- laravel - Ubuntu 调用 curl 到本地主机 www - 403 禁止
- php - “数据库打开的句柄太多”和 ibase_prepare