gpt4 book ai didi

java - 保护PDF文件和PDFBox中的 "saveIncremental"

转载 作者:行者123 更新时间:2023-12-02 09:40:53 27 4
gpt4 key购买 nike

我正在尝试使用权限和密码保护 PDF 文件,然后使用“saveIncremental”方法保存它(因为如果签名位于 PDF 文件内,我希望它即使在保护后也保持有效)。

这里是代码片段:

StandardProtectionPolicy standardProtectionPolicy = new StandardProtectionPolicy(ownerPassword, userPassword, accessPermission);

File protectedFile = new File(pdfFile.getParent(), substring + "_protected.pdf");

try (PDDocument document = PDDocument.load(pdfFile)) {

document.protect(standardProtectionPolicy);

SecurityHandler securityHandler = document.getEncryption().getSecurityHandler();
if (!securityHandler.hasProtectionPolicy()) {
throw new IllegalStateException("PDF contains an encryption dictionary, please remove it with "
+ "setAllSecurityToBeRemoved() or set a protection policy with protect()");
}
securityHandler.prepareDocumentForEncryption(document);

// update and save
document.getDocument().getEncryptionDictionary().setNeedToBeUpdated(true);
document.getEncryption().getCOSDictionary().setNeedToBeUpdated(true);

COSDictionary encrypt = (COSDictionary) document.getDocumentCatalog().getCOSObject().getDictionaryObject(COSName.ENCRYPT);
if (encrypt != null) encrypt.setNeedToBeUpdated(true);
document.getDocumentCatalog().getPages().getCOSObject().setNeedToBeUpdated(true);
document.getDocumentCatalog().getCOSObject().setNeedToBeUpdated(true);

document.saveIncremental(new FileOutputStream(protectedFile));
}

我用了this file .

Here结果 - protected PDF 文件和“allSecurityToBeRemoved”之后的同一文件。

用户密码为“user”,所有者密码为“owner”。

问题出在 protected 文件上。它的内容看不到,签名无效,所有签名信息都以不可读的字符显示...

使用“save”它可以工作,但使用“saveIncremental”则不行。是否可以使其与“saveIncremental”一起使用,以便签名保持有效?如果是,怎么办?

我正在使用 PDFBox 2.0.7 和 Adob​​e Acrobat Reader DC。

感谢您的帮助!

最佳答案

@Tilman 已经在评论中介绍了长处和短处

so in PDFBox there is no way how to encrypt file with signatures so the signatures will remain valid?

不是渐进的。不适用于 PDFBox,也不适用于其他软件。您必须在开始时(即创建 PDF 时)进行加密。 (或者您正常加密并保存,然后重新加载并签名并增量保存。

这里有一些背景说明:

当您签署 PDF 时,通常首先通过添加签名表单字段并在字段值中添加占位符来准备它,然后以加密方式签署此准备好的 PDF(减去占位符)并注入(inject)生成的签名到该占位符中。 (更详细地 here 。)结果:

sketch of signed pdf

因此,带符号的字节是序列化 PDF 文件中的实际字节,而不是某些(可能与加密无关)内存中表示形式。因此,这些字节的每次更改都会破坏签名

PDF 加密,另一方面,必须以相同的方式应用于所有文档修订版:给定 PDF 的所有修订版要么都加密(使用相同的密码或证书数据),要么没有,并且这意味着每个修订版本的预告片中至少有一个加密条目。

因此,如果您加密签名的 PDF,您会自动更改签名字节的某些部分,至少是尾部,因此您会破坏签名

不过,您可以同时加密和签名,或者首先创建加密的 PDF,然后在增量更新中对其进行签名。

(但请注意,ISO 32000-1 在这方面有点草率,没有提到注入(inject)的签名字节不能自行加密。ISO 32000-2 已经澄清了这一点,但现在有一些 PDF validator 那里假设签名字节要加密,有些则不然。更详细地说 here 。因此,加密和签名可能不值得麻烦...)

关于java - 保护PDF文件和PDFBox中的 "saveIncremental",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57075883/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com