Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 保护PDF文件和;“保存增量”;在PDFBox中_Java_Pdf_Pdfbox - Fatal编程技术网

Java 保护PDF文件和;“保存增量”;在PDFBox中

Java 保护PDF文件和;“保存增量”;在PDFBox中,java,pdf,pdfbox,Java,Pdf,Pdfbox,我试图用权限和密码保护PDF文件,然后用“saveIncremental”方法保存它(因为如果签名在PDF文件中,我希望它在保护后仍然有效) 下面是代码片段: StandardProtectionPolicy StandardProtectionPolicy=新的StandardProtectionPolicy(所有者密码、用户密码、访问权限); File protectedFile=新文件(pdfFile.getParent(),substring+“_protected.pdf”); try

我试图用权限和密码保护PDF文件,然后用“saveIncremental”方法保存它(因为如果签名在PDF文件中,我希望它在保护后仍然有效)

下面是代码片段:

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验证程序在那里