我正在使用以下代码:
PdfReader reader = new PdfReader("Input.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("Output.pdf"));
stamper.setEncryption("password".getBytes(), "password1".getBytes, PdfWriter.ALLOW_ASSEMBLY, PdfWriter.STANDARD_ENCRYPTION_128);
属性PdfWriter.ALLOW_ASSEMBLY
不会更改文档Assembly
的值,并且在创建输出pdf后仍显示为"Not allowed"
。
答案 0 :(得分:0)
首先,请注意,在加密上下文中授予的权限永远不会使用户能够比未加密文档执行更多的操作,这些权限仅决定多少< less 允许普通文档用户(即使用用户密码打开PDF的人)与文档所有者(即使用所有者密码打开PDF的人)进行比较。打开未加密的文档时,始终假定拥有完全所有者权限。
因此,在甚至不允许文档所有者进行某些操作的PDF查看器中,在加密期间设置匹配的ALLOW_*
标志不会突然使查看器允许某些用户使用这些操作。
在当前示例中就是这种情况,Adobe Reader不允许将文档组装在未加密的文档上或使用所有者密码打开的文档上。因此,Adobe Reader也不允许在使用ALLOW_ASSEMBLY
加密的文档中进行文档组装。
Adobe Reader和Adobe Acrobat中“文档属性”的“安全性”选项卡上的“文档限制摘要”不仅反映了加密过程中文档集的权限状态。相反,它们的确是基于大量输入的摘要,但并非全部取决于文档本身:
例如在Adobe Reader中,您的文档显示了所有者和用户的以下摘要限制:
在Adobe Acrobat中,您的文档显示了所有者和用户的以下摘要限制:
因此,默认情况下,Adobe Reader不允许文档组装或页面提取。因此,尽管有ALLOW_ASSEMBLY
,也不允许以用户身份打开您的文档。
另一方面,默认情况下,Adobe Acrobat允许所有操作。因此,由于ALLOW_ASSEMBLY
,它确实允许您以用户身份打开文档的文档组装。
如上所述,可以通过使用权限签名来允许超出默认情况下所讨论程序变体所允许的某些操作。很明显,Adobe Reader仅接受由Adobe为此授权的特殊私钥创建的使用权签名。
例如具有足够的Adobe Acrobat版本,您可以使用Adobe Reader中的菜单项“扩展功能”来使用它来创建这样的使用权签名,其他Adobe程序也可以用来设置其他使用权。