在文档安全管理中,通过编程控制 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)应用策略 - 保存文档
示例:禁止打印和复制,允许填写表单
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.allowfillformfields = true;
// 5. 应用加密策略
doc.encrypt(policy);
// 6. 保存新文档
doc.savetofile("受限文档.pdf");
}
}
}
权限属性一览
pdfdocumentprivilege 类提供以下常用布尔属性,可单独设置:
| 属性 | 说明 |
|---|---|
allowprint | 是否允许打印 |
allowcontentcopying | 是否允许复制文本和图形 |
allowmodifyannotations | 是否允许添加或修改注释 |
allowfillformfields | 是否允许填写表单字段 |
allowmodifycontents | 是否允许修改文档内容(非注释) |
allowassembly | 是否允许插入/旋转/删除页面(仅 128 位及以上加密) |
通常做法是:
- 若只允许少数操作,先
forbidall,再单独开启需要的项。 - 若只禁止少数操作,先
allowall,再关闭不需要的项。
示例:仅允许打印,其他全部禁止
policy.documentprivilege = pdfdocumentprivilege.forbidall; policy.documentprivilege.allowprint = true;
组合多个权限
所有权限属性可独立设置,互相不受影响。例如,允许高质量打印且允许复制内容,但禁止修改:
policy.documentprivilege = pdfdocumentprivilege.allowall; policy.documentprivilege.allowprint = true; policy.documentprivilege.allowcontentcopying = true; policy.documentprivilege.allowmodifycontents = false; policy.documentprivilege.allowmodifyannotations = false;
补充:移除权限保护(解密)
若需解密已加密的 pdf,可使用所有者密码加载后调用 decrypt():
pdfdocument doc = new pdfdocument();
doc.loadfromfile("受限文档.pdf", "owner@2026"); // 传入所有者密码
doc.decrypt();
doc.savetofile("已解密.pdf");
方法补充
在 c# 中限制 pdf 的复制和打印权限,核心是设置所有者密码并配置权限标志。需要注意的是,这些权限标志是“君子协定”,并非加密强制,专业的 pdf 工具仍可绕过。
下面以几个主流库为例,演示具体的实现方式。
1.itextsharp
itextsharp 通过 pdfwriter 的权限常量来控制。权限标志通过位运算组合,allow_printing 对应位 3,allow_copy 对应位 5。
using itextsharp.text.pdf;
string inputpdf = "input.pdf";
string outputpdf = "restricted.pdf";
using (var reader = new pdfreader(inputpdf))
using (var fs = new filestream(outputpdf, filemode.create))
using (var stamper = new pdfstamper(reader, fs))
{
// 权限标志:仅允许打印和复制(按位组合)
int permissions = pdfwriter.allow_printing | pdfwriter.allow_copy;
// 设置加密:用户密码(打开密码)、所有者密码(权限密码)、权限、加密算法
stamper.setencryption(
system.text.encoding.utf8.getbytes("user123"), // 用户密码,可为空字符串
system.text.encoding.utf8.getbytes("owner456"), // 所有者密码,必须设置
permissions,
pdfwriter.encryption_aes_128 // 使用 aes-128 加密
);
}如果要禁止复制和打印,只需从权限组合中移除对应的标志位:
int permissions = pdfwriter.allow_modify_annotations; // 仅允许修改注释,禁止打印和复制
2.aspose.pdf for .net
aspose.pdf 提供了 documentprivilege 类,通过布尔属性直观地控制权限,无需手动进行位运算。
using aspose.pdf;
using (document document = new document("input.pdf"))
{
// 1. 创建权限对象:从“全部禁止”开始
documentprivilege privilege = documentprivilege.forbidall;
// 2. 按需开启允许的操作
privilege.allowscreenreaders = true; // 允许屏幕阅读器
privilege.allowprint = false; // 禁止打印
privilege.allowcopy = false; // 禁止复制/提取内容
// 3. 加密文档:用户密码、所有者密码、权限、加密算法
document.encrypt(
"user123", // 用户密码(打开密码)
"owner456", // 所有者密码(权限密码)
privilege,
cryptoalgorithm.aesx256, // 使用 aes-256 加密
false // 是否仅使用权限密码加密
);
document.save("restricted.pdf");
}documentprivilege 的常用属性包括 allowprint(打印)、allowcopy(复制)、allowmodifycontents(修改内容)等,均可独立设置。
3.spire.pdf for .net
spire.pdf 使用 pdfsecuritypolicy 和 documentprivilege,api 风格与 aspose 类似,但无需商业授权即可使用免费版(有页数限制)。
using spire.pdf;
using spire.pdf.security;
pdfdocument doc = new pdfdocument();
doc.loadfromfile("input.pdf");
// 1. 创建密码安全策略
string userpwd = ""; // 打开文档无需密码
string ownerpwd = "owner@2026"; // 所有者密码
pdfpasswordsecuritypolicy policy = new pdfpasswordsecuritypolicy(userpwd, ownerpwd);
// 2. 设置加密算法
policy.encryptionalgorithm = pdfencryptionalgorithm.aes_256;
// 3. 通过 documentprivilege 设置权限
policy.documentprivilege.allowprint = false; // 禁止打印
policy.documentprivilege.allowcontentcopying = false; // 禁止复制
policy.documentprivilege.allowmodifyannotations = false; // 禁止修改注释
policy.documentprivilege.allowfillfields = true; // 允许填写表单
// 4. 应用策略并保存
doc.encrypt(policy);
doc.savetofile("restricted.pdf");spire.pdf 的 documentprivilege 支持丰富的权限属性,如 allowassembly(页面组装)、allowmodifycontents(修改内容)等。
4.ironpdf
ironpdf 通过 securitysettings 属性直接暴露权限开关,代码最为简洁。
using ironpdf;
var pdf = pdfdocument.fromfile("input.pdf");
// 设置密码
pdf.securitysettings.userpassword = ""; // 打开无需密码
pdf.securitysettings.ownerpassword = "owner456"; // 所有者密码
// 设置权限
pdf.securitysettings.allowuserprinting = ironpdf.security.pdfprintsecurity.noprint; // 禁止打印
pdf.securitysettings.allowusercopypastecontent = false; // 禁止复制粘贴
pdf.saveas("restricted.pdf");5.syncfusion pdf
syncfusion 通过 pdfsecurity 对象设置 ownerpassword 和 permissions 标志。
using syncfusion.pdf;
using syncfusion.pdf.security;
pdfdocument document = new pdfdocument();
document.loadfromfile("input.pdf");
// 设置所有者密码和权限
document.security.ownerpassword = "owner456";
document.security.userpassword = "";
document.security.permissions = pdfpermissionsflags.default; // 默认权限通常禁止复制和打印
document.save("restricted.pdf");pdfpermissionsflags 提供了 copycontent、print、fullqualityprint 等标志,可通过 | 和 & ~ 组合或排除权限。
6.pdfsharp
pdfsharp 使用 pdfsecuritysettings,属性命名直观,每个权限对应一个布尔属性。
using pdfsharp.pdf;
using pdfsharp.pdf.security;
pdfdocument document = pdfreader.open("input.pdf", pdfdocumentopenmode.modify);
pdfsecuritysettings security = document.securitysettings;
// 设置密码和权限
security.userpassword = "";
security.ownerpassword = "owner456";
security.permitprint = false; // 禁止打印
security.permitextractcontent = false; // 禁止复制/提取内容
security.permitfullqualityprint = false; // 禁止高质量打印
document.save("restricted.pdf");注意:pdfsharp 需要将安全级别设置为 pdfdocumentsecuritylevel.encrypted128bit 或更高,权限设置才会生效。
注意事项
- 用户密码为空:打开文档无需密码,但权限限制依然生效(由所有者密码持有者控制)。
- 加密算法:
aes_256安全性最高,但旧版 pdf 阅读器可能不支持;如需兼容性,可使用aes_128。 - 免费版限制:free spire.pdf 对文档页数有限制(通常为 10 页),超出部分可能无法处理。评估时可使用小型文件测试。
总结
通过 pdfsecuritypolicy,开发者可以以面向对象的方式清晰管理 pdf 的加密和权限。只需几行代码,即可灵活控制打印、复制、修改等操作,满足企业文档安全需求。这种方案代码可读性强,易于维护,是处理 pdf 权限控制的推荐实践。
到此这篇关于c#代码如何设置限制pdf复制和打印权限的文章就介绍到这了,更多相关c#设置pdf权限内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论