Java 保护PDF文件和;“保存增量”;在PDFBox中
我试图用权限和密码保护PDF文件,然后用“saveIncremental”方法保存它(因为如果签名在PDF文件中,我希望它在保护后仍然有效) 下面是代码片段:Java 保护PDF文件和;“保存增量”;在PDFBox中,java,pdf,pdfbox,Java,Pdf,Pdfbox,我试图用权限和密码保护PDF文件,然后用“saveIncremental”方法保存它(因为如果签名在PDF文件中,我希望它在保护后仍然有效) 下面是代码片段: StandardProtectionPolicy StandardProtectionPolicy=新的StandardProtectionPolicy(所有者密码、用户密码、访问权限); File protectedFile=新文件(pdfFile.getParent(),substring+“_protected.pdf”); try
StandardProtectionPolicy StandardProtectionPolicy=新的StandardProtectionPolicy(所有者密码、用户密码、访问权限);
File protectedFile=新文件(pdfFile.getParent(),substring+“_protected.pdf”);
try(PDDocument=PDDocument.load(pdfFile)){
文件保护(标准保护政策);
SecurityHandler SecurityHandler=document.getEncryption().getSecurityHandler();
如果(!securityHandler.hasProtectionPolicy()){
抛出新的IllegalStateException(“PDF包含加密字典,请使用删除它”
+“setAllSecurityToBeRemoved()或使用protect()设置保护策略”;
}
证券经办人。编制加密文件(文件);
//更新和保存
document.getDocument().getEncryptionDictionary().setNeedToBeUpdated(true);
document.getEncryption().getCOSDictionary().setNeedToBupdated(true);
COSDictionary encrypt=(COSDictionary)document.getDocumentCatalog().getCOSObject().getDictionaryObject(COSName.encrypt);
如果(encrypt!=null)encrypt.setNeedToBeUpdated(true);
document.getDocumentCatalog().getPages().getCOSObject().setNeedToBeUpdate(true);
document.getDocumentCatalog().getCOSObject().setNeedToBeUpdated(true);
document.saveIncremental(新文件输出流(protectedFile));
}
我用过
结果受保护的PDF文件和“allSecurityToBeRemoved”后的同一文件
用户密码为“用户”,所有者密码为“所有者”
问题是那个受保护的文件。其内容不可见,签名无效,所有签名信息以无法读取的字符显示
使用“save”可以工作,但使用“saveIncremental”则不行。是否可以使其与“saveIncremental”一起工作,以便签名仍然有效?如果是,如何进行
我正在使用PDFBOX2.0.7和AdobeAcrobatReaderDC
谢谢你的帮助 @Tilman已经在一篇评论中陈述了长短不一的观点 因此,在PDFBox中,无法使用签名对文件进行加密,从而使签名保持有效
不是递增的。不适用于PDFBox,也不适用于其他软件。您必须在开始时加密,即在创建PDF时。(或者您可以正常加密和保存,然后重新加载、签名并增量保存 以下是一些背景说明: 签署PDF时,通常首先通过在字段值中添加带有占位符的签名表单字段进行准备,然后以加密方式签署此准备好的PDF减去占位符,并将生成的签名插入该占位符。(更详细)结果: 因此,签名字节是序列化PDF文件中的实际字节,而不是内存表示中的某些字节(可能与加密无关),因此这些字节的每次更改都会破坏签名 另一方面,PDF加密必须在所有文档修订中应用相同的方法:要么对给定PDF的所有修订进行加密(使用相同的密码或证书数据),要么不加密,这意味着每个修订的尾部至少有一个加密条目 因此,如果加密已签名的PDF,则会自动更改已签名字节的某些部分,至少是尾部,因此会破坏签名 不过,您可以同时进行加密和签名,或者先创建加密的PDF,然后在增量更新中对其进行签名
(请注意,ISO 32000-1在这方面有点草率,没有提到注入的签名字节不能自己加密。ISO 32000-2已经澄清了这一点,但现在有一些PDF验证器假设签名字节要加密,而有些则不加密。更详细地说,加密和签名都是如此因此,可能不值得麻烦……@Tilman已经在一篇评论中陈述了长短不一的观点 因此,在PDFBox中,无法使用签名对文件进行加密,从而使签名保持有效
不增量。不使用PDFBox,也不使用其他软件。您必须在开始时加密,即在创建PDF时。(或者您正常加密和保存,然后重新加载、签名并增量保存。) 以下是一些背景说明: 签署PDF时,通常首先通过在字段值中添加带有占位符的签名表单字段进行准备,然后以加密方式签署此准备好的PDF减去占位符,并将生成的签名插入该占位符。(更详细)结果: 因此,签名字节是序列化PDF文件中的实际字节,而不是内存表示中的某些字节(可能与加密无关),因此这些字节的每次更改都会破坏签名 另一方面,PDF加密必须在所有文档修订中应用相同的方法:要么对给定PDF的所有修订进行加密(使用相同的密码或证书数据),要么不加密,这意味着每个修订的尾部至少有一个加密条目 因此,如果加密已签名的PDF,则会自动更改已签名字节的某些部分,至少是尾部,因此会破坏签名 不过,您可以同时进行加密和签名,或者先创建加密的PDF,然后在增量更新中对其进行签名 (不过,请注意,ISO 32000-1在这方面有点草率,没有提到注入的签名字节不能自己加密。ISO 32000-2对此进行了澄清,但现在有一些PDF验证程序在那里