iTextSharp 5.x 商用加密功能受限,需改用 iText7(MIT 协议);加密须区分 owner/user 密码、使用 AES-256 及权限常量组合,且加密与签名不可共存。
用 iTextSharp 给 PDF 加密必须先确认许可证合规性
itextsharp 5.x 是 lgpl 开源版,但商用加密功能(如 aes-256、权限位控制)在 5.5.13 后被移入商业分支 itextsharp.lgplv2.core;直接 nuget 安装 itextsharp 并调用 setencryption 可能静默失败或生成无密码保护的文件。你看到 pdf 打开没提示输入密码,大概率是用了不支持加密的构建版本。
实操建议:
- 优先改用官方维护的开源替代:
iText7(MIT 协议),安装iText7.PdfCore和iText7.BouncyCastleProvider - 若必须用旧项目中的 iTextSharp 5.x,请手动下载带完整加密支持的二进制(如 5.5.10),并确认
itextsharp.dll的强名称签名未被篡改 - 测试时别只看“是否弹密码框”,用 Adobe Acrobat 打开 → 文件 → 属性 → 安全 → 查看“安全方法”和“权限”是否真实生效
PDF 加密不是设个密码就完事:owner vs user 密码要分清
SetEncryption 方法的四个参数里,userPassword 和 ownerPassword 功能完全不同:userPassword 控制打开文档(即“打开密码”),ownerPassword 控制修改权限(如打印、复制、注释)。很多人只传了 userPassword,留空 ownerPassword,结果 PDF 无法打开——因为 iText 默认要求两者至少一个非空,且若 userPassword 非空而 ownerPassword 为空,它会自动生成 owner 密码,但这个生成逻辑不可控,导致后续权限设置失效。
实操建议:
- 明确业务需求:是否需要“打开即要密码”?还是仅限制编辑行为?前者填
userPassword,后者可留空userPassword但必须提供ownerPassword - 权限掩码别硬写数字,用常量:比如
PdfWriter.STANDARD_ENCRYPTION_128表示 128 位 RC4,PdfWriter.ENCRYPTION_AES_256表示 AES-256(iText7 中对应EncryptionConstants.STANDARD_ENCRYPTION_AES_256) - 禁止用弱加密:RC4 已被 Adobe 废弃,PDF 2.0 不再支持;生产环境务必用
AES_256
iText7 中设置打印/复制等权限的实际写法
权限不是靠密码决定的,而是通过 EncryptionConstants 中的标志位组合控制。比如想允许打印但禁止复制文字,不能只设密码,得显式传入权限整数。iText7 把权限抽象为 EncryptionConstants 下的静态字段,组合时用按位或(|)。
示例代码片段(C#):
var writer = new PdfWriter("out.pdf", new WriterProperties()
.SetStandardEncryption(
"user123".ToCharArray(),
"owner456".ToCharArray(),
EncryptionConstants.ALLOW_PRINTING | EncryptionConstants.ALLOW_FILL_IN,
EncryptionConstants.ENCRYPTION_AES_256));
注意点:
-
ALLOW_PRINTING≠ 允许高清打印:它只控制“是否允许打印”,实际打印质量由阅读器策略决定;若需禁止高分辨率打印,必须配合ALLOW_DEGRADED_PRINTING(但多数阅读器忽略该位) -
ALLOW_COPY对图片、表单域无效,仅限制文本选择与复制;嵌入字体若未授权嵌入,即使允许复制,复制出的文字也可能乱码 - 权限位一旦写入 PDF 就不可逆,测试阶段建议每次生成新文件,别反复覆盖
加密后 PDF 在某些阅读器里行为异常怎么办
不是所有阅读器严格遵守 PDF 规范。比如 Edge 内置 PDF 查看器对 AES-256 支持不稳定,可能跳过密码提示直接报错 Invalid PDF file structure;微信内置浏览器打开加密 PDF 会直接拒绝加载;甚至部分 Linux 下的 Evince 会把 owner 密码误当 user 密码处理。
排查路径:
- 先用
qpdf --show-encryption in.pdf命令行检查加密元数据是否写入成功(需提前安装 qpdf) - 换 Adobe Acrobat Reader DC 打开,它是事实标准,能准确反馈权限位是否生效
- 如果目标用户集中在企业内网,确认其统一部署的 PDF 阅读器版本(如福昕 11.0+ 才完整支持 AES-256)
- 避免在加密 PDF 中嵌入 JavaScript 或动态表单——加密会破坏其签名完整性,导致 Acrobat 提示“文档已损坏”
最麻烦的一点:PDF 加密和数字签名不能共存于同一文档。加了密再签,签名会失效;签了名再加密,签名验证时会失败。这事没法绕开,只能选一边。



















