在文档安全管理中,通过编程控制 PDF 的访问权限(如禁止打印、禁止复制等)是常见需求。本文使用 Free Spire.PDF for .NET 免费库,基于其 PdfSecurityPolicy 类,介绍如何用简洁的 C# 代码完成权限设置。
两种密码的角色
- 用户密码(User Password) :打开文档时输入的密码。若设为空字符串,则打开无需密码。
- 所有者密码(Owner Password) :用于控制文档权限的"管理密码"。持有者密码可以设置或解除各项操作限制。
用户密码决定"能否打开",所有者密码决定"能做什么"。
环境准备
通过 NuGet 安装免费版包:
PM> Install-Package FreeSpire.PDF
该免费版无功能水印,但有页数限制(前 10 页),适用于评估和小型项目。
核心类:PdfSecurityPolicy
该免费 PDF 库使用 PdfSecurityPolicy 及其派生类 PdfPasswordSecurityPolicy 来统一管理加密算法、密码和权限。此方式将各个关注点分离,代码更加清晰。
基本步骤
- 加载 PDF 文档
- 创建
PdfPasswordSecurityPolicy,传入用户密码和所有者密码 - 设置加密算法(如 AES-256)
- 通过
DocumentPrivilege属性指定允许或禁止的操作 - 调用
doc.Encrypt(securityPolicy)应用策略 - 保存文档
示例:禁止打印和复制,允许填写表单
csharp
using Spire.Pdf;
using Spire.Pdf.Security;
namespace PdfPermissionDemo
{
class Program
{
static void Main(string[] args)
{
// 1. 加载 PDF
PdfDocument doc = new PdfDocument();
doc.LoadFromFile("原始文档.pdf");
// 2. 创建密码安全策略
string userPwd = ""; // 打开无需密码
string ownerPwd = "owner@2026"; // 权限密码
PdfPasswordSecurityPolicy policy = new PdfPasswordSecurityPolicy(
userPwd, ownerPwd);
// 3. 使用 AES-256 加密(更安全)
policy.EncryptionAlgorithm = PdfEncryptionAlgorithm.AES_256;
// 4. 设置权限
policy.DocumentPrivilege.AllowPrint = false; // 禁止打印
policy.DocumentPrivilege.AllowContentCopying = false; // 禁止复制
policy.DocumentPrivilege.AllowModifyAnnotations = false; // 禁止修改注释
// 允许填写表单(默认允许,如需禁用可设为 false)
policy.DocumentPrivilege.AllowFillFields = true;
// 5. 应用加密策略
doc.Encrypt(policy);
// 6. 保存新文档
`
doc.SaveToFile(`"受限文档.pdf"`);`
`
}`
`
}`
`
}`
`
`
权限属性一览
PdfDocumentPrivilege 类提供以下常用布尔属性,可单独设置:
| 属性 | 说明 |
|---|---|
AllowPrint |
是否允许打印 |
AllowContentCopying |
是否允许复制文本和图形 |
AllowModifyAnnotations |
是否允许添加或修改注释 |
AllowFillFormFields |
是否允许填写表单字段 |
AllowModifyContents |
是否允许修改文档内容(非注释) |
AllowAssembly |
是否允许插入/旋转/删除页面(仅 128 位及以上加密) |
通常做法是:
- 若只允许少数操作,先
ForbidAll,再单独开启需要的项。 - 若只禁止少数操作,先
AllowAll,再关闭不需要的项。
示例:仅允许打印,其他全部禁止
csharp
policy.DocumentPrivilege = PdfDocumentPrivilege.ForbidAll;
policy.DocumentPrivilege.AllowPrint = true;
组合多个权限
所有权限属性可独立设置,互相不受影响。例如,允许高质量打印且允许复制内容,但禁止修改:
csharp
policy.DocumentPrivilege = PdfDocumentPrivilege.AllowAll;
policy.DocumentPrivilege.AllowPrint = true;
policy.DocumentPrivilege.AllowContentCopying = true;
policy.DocumentPrivilege.AllowModifyContents = false;
policy.DocumentPrivilege.AllowModifyAnnotations = false;
补充:移除权限保护(解密)
若需解密已加密的 PDF,可使用所有者密码加载后调用 Decrypt():
csharp
PdfDocument doc = new PdfDocument();
doc.LoadFromFile("受限文档.pdf", "owner@2026"); // 传入所有者密码
doc.Decrypt();
doc.SaveToFile("已解密.pdf");
注意事项
- 用户密码为空 :打开文档无需密码,但权限限制依然生效(由所有者密码持有者控制)。
- 加密算法 :
AES_256安全性最高,但旧版 PDF 阅读器可能不支持;如需兼容性,可使用AES_128。 - 免费版限制 :Free Spire.PDF 对文档页数有限制(通常为 10 页),超出部分可能无法处理。评估时可使用小型文件测试。
总结
通过 PdfSecurityPolicy,开发者可以以面向对象的方式清晰管理 PDF 的加密和权限。只需几行代码,即可灵活控制打印、复制、修改等操作,满足企业文档安全需求。这种方案代码可读性强,易于维护,是处理 PDF 权限控制的推荐实践。