在C#项目开发中,对PDF文档进行加密是保护文档内容安全的常见需求,通过iText7库可以便捷地实现PDF打开密码设置和打印权限控制,满足不同场景下的文档权限管理要求。

环境准备
首先需要安装iText7的相关NuGet包,在Visual Studio的NuGet包管理器中搜索iText7,安装最新稳定版本即可。如果是.NET Core项目,也可以直接执行以下命令安装:
dotnet add package iText7
iText7加密核心概念
iText7中PDF加密主要通过PdfWriter的配置实现,涉及两个关键密码:
- 用户密码(User Password):打开PDF文档时需要输入的密码,输入正确才能查看文档内容。
- 所有者密码(Owner Password):用于设置文档权限的密码,拥有该密码可以修改文档的权限配置,即使文档设置了用户密码,使用所有者密码打开也可以不受权限限制。
同时iText7提供了EncryptionConstants类来定义各类权限,打印权限对应的常量是ALLOW_PRINTING,如果需要禁止打印,只需要不添加该权限即可。
设置打开密码与打印权限的实现步骤
1. 创建加密的PDF文档
以下代码演示了创建一个带打开密码,且允许打印的PDF文档的完整过程:
using System;
using System.IO;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
namespace PdfEncryptionDemo
{
class Program
{
static void Main(string[] args)
{
// 定义输出PDF路径
string outputPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "encrypted_pdf.pdf");
// 定义用户密码和所有者密码
string userPassword = "123456";
string ownerPassword = "admin888";
// 创建PdfWriter属性,配置加密参数
WriterProperties properties = new WriterProperties();
// 设置加密,传入用户密码、所有者密码、权限、加密算法
properties.SetStandardEncryption(
userPassword.GetBytes(),
ownerPassword.GetBytes(),
EncryptionConstants.ALLOW_PRINTING, // 允许打印权限
EncryptionConstants.ENCRYPTION_AES_256 // 使用AES256加密算法
);
// 创建PdfWriter并传入配置属性
using (PdfWriter writer = new PdfWriter(outputPath, properties))
{
// 创建PdfDocument
using (PdfDocument pdf = new PdfDocument(writer))
{
// 创建Document对象用于添加内容
using (Document document = new Document(pdf))
{
// 添加PDF内容
document.Add(new Paragraph("这是一个加密的PDF文档,需要输入密码才能打开,且允许打印。"));
document.Add(new Paragraph("所有者密码可以修改文档权限配置。"));
}
}
}
Console.WriteLine($"加密PDF已生成,路径:{outputPath}");
}
}
}
2. 禁止打印权限的配置
如果需要禁止PDF文档被打印,只需要调整权限参数,不添加ALLOW_PRINTING即可,修改后的加密配置代码如下:
// 创建PdfWriter属性,配置加密参数
WriterProperties properties = new WriterProperties();
// 设置加密,不添加打印权限,仅允许屏幕阅读
properties.SetStandardEncryption(
userPassword.GetBytes(),
ownerPassword.GetBytes(),
EncryptionConstants.ALLOW_SCREENREADERS, // 仅允许屏幕阅读,禁止打印
EncryptionConstants.ENCRYPTION_AES_256
);
权限常量说明
iText7中常用的权限常量如下表所示:
| 常量名称 | 权限说明 |
|---|---|
| ALLOW_PRINTING | 允许打印文档 |
| ALLOW_MODIFY_CONTENTS | 允许修改文档内容 |
| ALLOW_COPY | 允许复制文档内容 |
| ALLOW_SCREENREADERS | 允许屏幕阅读器读取内容 |
| ALLOW_ASSEMBLY | 允许插入、删除、旋转页面等操作 |
注意事项
- 加密算法推荐使用
ENCRYPTION_AES_256,安全性更高,如果需要兼容旧版PDF阅读器,可以选择ENCRYPTION_AES_128。 - 如果仅设置所有者密码,不设置用户密码,文档打开时不需要输入密码,但权限会受到限制。
- 使用所有者密码打开加密PDF时,可以不受权限限制,因此所有者密码需要妥善保管,避免泄露。
提示:如果需要对已有的PDF文档添加加密,可以先使用PdfReader读取原文档,再通过PdfWriter的加密配置输出新的加密文档,流程和新创建文档类似。