我一直试图对我的pdf进行许可。 我有一个方法,它将在一个名为access
的实例变量上设置访问权限 private AccessPermission access = new AccessPermission();
public void setPdfPermissions(boolean allowPrint, boolean degradePrint,
boolean editPage, boolean allowAssembly, boolean allowCopy,
boolean allowReaders, boolean editAnnotation, boolean allowFillIn) {
if (allowPrint) { // allow printing
access.setCanPrint(allowPrint);
}
if (degradePrint) { // degrade printing
access.setCanPrintDegraded(allowAssembly);
}
if (editPage) { // edit page contents
access.setCanModify(editPage);
}
if (allowAssembly) { // insert, remote or rotate page
access.setCanAssembleDocument(allowAssembly);
}
if (allowCopy) { // copy page contents or graphics
access.setCanExtractForAccessibility(allowCopy);
}
if (allowReaders) { // screen readers can copy contents or graphics
access.setReadOnly();
}
if (editAnnotation) { // edit annotations
access.setCanModifyAnnotations(editAnnotation);
}
if (allowFillIn) { // fill form fields
access.setCanFillInForm(allowFillIn);
}
}
然后我在安全处理程序中保存访问权限
StandardSecurityHandler secHandler = new StandardSecurityHandler();
if((userPass != null) || (ownerPass != null)) {
System.out.println("userPass:"+userPass+"owner pass:"+userPass);
// TODO
StandardProtectionPolicy policy = new StandardProtectionPolicy(ownerPass.toString(), userPass.toString(),
access);
secHandler = new StandardSecurityHandler(policy);
document.setSecHandler(secHandler);
当我将setPrint之类的值传递为false时,它允许我打印。任何帮助都非常感谢。
答案 0 :(得分:1)
您的第二个代码块错误。 {(3}}描述了加密文件的正确方法(至少对1.8版本而言)。所以对你来说,正确的代码是:
// owner password to open the file with all permissions
// user password to open the file but with restricted permissions, can be empty
StandardProtectionPolicy spp = new StandardProtectionPolicy(ownerPass, userPass, access);
spp.setEncryptionKeyLength(128);
doc.protect(spp);
编辑:另请参阅mkl的答案,为什么您的第一个代码段也是错误的: - )
答案 1 :(得分:1)
除了@Tilman的回答,第一个代码块也是错误的:
对于每个boolean
参数,setPdfPermissions
仅在值为true
时执行某些操作,例如:
if (allowPrint) { // allow printing
access.setCanPrint(allowPrint);
}
如果默认情况下未授予权限,这将有效。但是,查看AccessPermission
默认构造函数的定义,可以看到相反的情况,例如在1.8.10的代码中:
/**
* Create a new access permission object.
* By default, all permissions are granted.
*/
public AccessPermission()
{
bytes = DEFAULT_PERMISSIONS;
}
因此,setPdfPermissions
本质是一个很大的NOP(无操作)代码块。