C# 如何限制 PDF 复制、打印权限?

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

两种密码的角色

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

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

环境准备

通过 NuGet 安装免费版包:

shell 复制代码
PM> Install-Package FreeSpire.PDF

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

核心类:PdfSecurityPolicy

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

基本步骤

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

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

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 权限控制的推荐实践。

相关推荐
c#上位机1 小时前
C#上位机项目实战——exe项目调试更改dll中源代码
开发语言·c#
淡海水3 小时前
06-02-源码-增量标记算法实现
算法·unity·c#·gc
淡海水4 小时前
06-01-源码-Incremental GC总览与设计
unity·c#·gc
江沉晚呤时6 小时前
零依赖的代价与自由:我用 C# 自研了一套 Office 读写库
开发语言·c#
zimoyin8 小时前
Windows 控件获取全攻略:Win32 / UIA / MSAA + 鼠标拾取与点击关联(C# 实战)
c#·自动化
小羊没烦恼!18 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
昂好的day20 小时前
VisionMaster 通信模块实战(上):Modbus、TCP 收发、协议组装解析
开发语言·网络·网络协议·tcp/ip·c#
波力海苔夹心脆6751 天前
C# 正则表达式零基础入门:从“看得懂“到“会用“
经验分享·后端·mysql·正则表达式·c#
昂好的day1 天前
VisionMaster(VM) 标定工具详解(上):为什么必须标定 + 九点标定手眼标定
开发语言·数码相机·c#
Elastic 中国社区官方博客1 天前
Observability:当 YAML 遇上 IConfiguration:OpenTelemetry .NET SDK 的声明式配置
大数据·开发语言·elasticsearch·搜索引擎·全文检索·.net