当前位置: 代码网 > it编程>编程语言>Asp.net > C#代码如何设置限制PDF复制和打印权限

C#代码如何设置限制PDF复制和打印权限

2026年09月10日 Asp.net 我要评论
在文档安全管理中,通过编程控制 pdf 的访问权限(如禁止打印、禁止复制等)是常见需求。本文使用 free spire.pdf for .net 免费库,基于其 pdfsecuritypolicy 类

在文档安全管理中,通过编程控制 pdf 的访问权限(如禁止打印、禁止复制等)是常见需求。本文使用 free spire.pdf for .net 免费库,基于其 pdfsecuritypolicy 类,介绍如何用简洁的 c# 代码完成权限设置。

两种密码的角色

  • 用户密码(user password):打开文档时输入的密码。若设为空字符串,则打开无需密码。
  • 所有者密码(owner password):用于控制文档权限的“管理密码”。持有者密码可以设置或解除各项操作限制。

用户密码决定“能否打开”,所有者密码决定“能做什么”。

环境准备

通过 nuget 安装免费版包:

pm> install-package freespire.pdf

该免费版无功能水印,但有页数限制(前 10 页),适用于评估和小型项目。

核心类:pdfsecuritypolicy

该免费 pdf 库使用 pdfsecuritypolicy 及其派生类 pdfpasswordsecuritypolicy 来统一管理加密算法、密码和权限。此方式将各个关注点分离,代码更加清晰。

基本步骤

  1. 加载 pdf 文档
  2. 创建 pdfpasswordsecuritypolicy,传入用户密码和所有者密码
  3. 设置加密算法(如 aes-256)
  4. 通过 documentprivilege 属性指定允许或禁止的操作
  5. 调用 doc.encrypt(securitypolicy) 应用策略
  6. 保存文档

示例:禁止打印和复制,允许填写表单

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 提供了 copycontentprintfullqualityprint 等标志,可通过 | 和 & ~ 组合或排除权限。

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权限内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com