iText7 API权限标记类型不一致致权限判断异常问题咨询
问题分析:iText7权限校验类型不匹配导致的误判
这不是iText7的Bug,而是你在权限标记使用上存在类型转换的误区,具体原因如下:
权限掩码的位数差异
PdfReader.getPermissions()返回的long类型,对应PDF规范中64位的权限掩码(支持PDF 2.0及更高版本的扩展权限);PdfEncryptor.isAssemblyAllowed(int permissions)的入参是32位int,仅适配旧版PDF的权限掩码格式。
强转导致的信息丢失
直接将long强转为int时,会丢失高32位的权限信息。如果汇编权限恰好存储在高32位,PdfEncryptor.isAssemblyAllowed()就无法正确识别,会错误返回true;但实际合并操作时,底层会校验完整的64位权限,因此抛出权限不足的异常。
正确的权限校验方式
不要使用PdfEncryptor的旧版方法,直接通过PdfReader或PdfDocument提供的API精准判断汇编权限:
// 方式1:通过PdfReader获取完整权限后自行判断 long permissions = pdfReader.getPermissions(); boolean isAssemblyAllowed = (permissions & PdfWriter.ALLOW_ASSEMBLY) != 0; // 方式2:使用PdfReader内置的权限检查方法(更简洁) boolean isAssemblyAllowed = pdfReader.isAssemblyAllowed();
关于临时方案的补充
你目前用PdfReader.isOpenedWithFullPermission()判断确实偏谨慎,因为该方法仅当拥有全部权限时才返回true,但实际上合并操作只需要汇编权限即可,不需要所有权限。使用上面的正确方式可以精准判断,避免误拦截合法的合并操作。
内容的提问来源于stack exchange,提问作者Qwertz
相关产品推荐
相关产品推荐

