如何使用iText 7禁用PDF的复制、打印与保存功能
基于iText 7实现禁止复制、打印、保存的受限PDF方法
iText 7的PDF权限管控基于PDF标准的加密权限位机制实现,通过对应参数配置即可完成受限属性标记,具体实现逻辑如下:
核心配置规则
- 实现受限PDF需要依托iText 7的
kernel模块加密能力,无需额外引入第三方插件 - 权限管控需要通过
WriterProperties配置标准加密参数,明确剔除所有终端可执行的操作权限:- 拦截内容复制:关闭
PdfWriter.ALLOW_COPY权限标记 - 拦截打印操作:关闭
PdfWriter.ALLOW_PRINTING、PdfWriter.ALLOW_DEGRADED_PRINTING全量打印权限 - 拦截保存/修改操作:关闭所有编辑类权限标记,包含
PdfWriter.ALLOW_MODIFY_CONTENTS、PdfWriter.ALLOW_MODIFY_ANNOTATIONS、PdfWriter.ALLOW_FILL_IN、PdfWriter.ALLOW_ASSEMBLY
- 拦截内容复制:关闭
- 加密配置需要将终端用户打开的访问密码设置为空,终端用户打开文件无需输入密码,但权限标记会被合规PDF阅读器严格校验;同时配置独立的所有者密码,仅权限管理员可通过该密码解除所有限制
核心实现代码
import com.itextpdf.kernel.pdf.EncryptionConstants; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfReader; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.ReaderProperties; import com.itextpdf.kernel.pdf.WriterProperties; public class RestrictedPdfBuilder { /** * 生成带操作限制的PDF * @param sourceOriginPdf 源原始PDF路径 * @param outputRestrictedPdf 输出的受限PDF路径 */ public static void buildRestrictedPdf(String sourceOriginPdf, String outputRestrictedPdf) { // 权限位设为0,代表不对终端用户开放任何操作权限 int restrictedPermissions = 0; WriterProperties writerProperties = new WriterProperties() .setStandardEncryption( "".getBytes(), // 终端用户打开密码:为空,无需输入即可打开 "custom_owner_pwd_2024".getBytes(), // 所有者密码:仅管理员持有,用于解除限制 restrictedPermissions, EncryptionConstants.ENCRYPTION_AES_256 // 采用AES256加密,兼容主流阅读器 ); try (PdfWriter pdfWriter = new PdfWriter(outputRestrictedPdf, writerProperties); PdfReader pdfReader = new PdfReader(sourceOriginPdf, new ReaderProperties()); PdfDocument pdfDocument = new PdfDocument(pdfReader, pdfWriter)) { // 完成文档读写,自动应用配置的权限规则 } } }
落地注意事项
- 权限位值设置为0时,Adobe Acrobat、Chrome/Edge内置PDF阅读器等主流合规工具都会自动拦截对应的复制、打印、另存为、编辑操作,符合常规受限PDF的使用预期
- 不可通过非加密方式设置权限标记,这类无加密的标记不会被阅读器识别校验,所有限制规则都无法生效
- AES256加密方案对2020年之后发布的主流PDF阅读器兼容性良好,若终端存在大量老旧阅读器,可根据实际场景切换为128位RC4加密方案
- 该权限标记的管控效力依赖阅读器的合规校验逻辑,无法从技术层面完全阻断强制破解类的内容提取操作,仅适用于常规的内容展示权限管控场景
内容的提问来源于stack exchange,提问作者user2493442
相关产品推荐
相关产品推荐

