Apache PDFBox签名PDF后无法修改,如何允许可失效的修改?
用Apache PDFBox创建允许修改的不可见审批签名
原代码的问题
你当前的代码创建的是普通分离式签名,这类签名默认会锁定整个文档,不允许任何后续修改——哪怕你接受修改后签名失效的结果,也需要显式配置签名的权限参数,否则PDF阅读器会直接禁止编辑操作。
解决方案:配置DocMDP权限实现审批签名
要实现「允许客户端修改文本,修改后签名失效」的需求,需要在签名字典中添加**DocMDP(文档修改权限)**变换,指定允许的修改类型,同时保持签名不可见。以下是修改后的代码:
public void signDetached(PDDocument document, OutputStream output) throws IOException { PDSignature signature = new PDSignature(); signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE); signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED); signature.setName("Testing User"); signature.setLocation("Los Angeles, CA"); signature.setReason("Testing"); signature.setSignDate(Calendar.getInstance()); // 配置DocMDP权限:允许所有修改(修改后签名失效) PDTransformParams transformParams = new PDTransformParams(); // P=3:允许所有修改操作(除了删除当前签名) // 若仅需允许填充表单/添加注释,可将P设为2 transformParams.setP(3); transformParams.setType(PDTransformParams.TYPE_DOCMDP); PDActionMDP actionMDP = new PDActionMDP(); actionMDP.setTransformParams(transformParams); actionMDP.setS(PDActionMDP.SUBTYPE_DOCMDP); signature.setAction(actionMDP); // 添加不可见签名:不指定可视化签名域 document.addSignature(signature, this); document.saveIncremental(output); }
关键说明
- DocMDP权限参数:
P=1:禁止任何修改(默认行为)P=2:仅允许填充表单、添加注释、创建新签名P=3:允许所有修改操作(修改后原签名会被标记为无效,完全符合你的需求)
- 不可见签名:代码中未配置任何可视化签名域(如
PDVisibleSigProperties),因此签名不会在PDF页面上显示,仅存在于文档的签名字典中。 - 增量保存:使用
saveIncremental确保签名以增量方式写入,不会破坏原文档的内容结构。
内容的提问来源于stack exchange,提问作者Joniras
相关产品推荐
相关产品推荐

