01. 背景
今天下午老板神秘兮兮的来问我,能不能做个文档加密功能,就是那种用户下载打开需要密码才能打开的那种效果。boss都发话了,那必须可以。
- 需求:将 pdf 文档经过加密处理,客户下载pdf文档,打开文档需要密码验证。
- 实现:.net8 + itext7 + 控制台,当然可以做成服务或者 webapi 接口。
- 加密:共有两个密码,一个是发行密码,通过这个密码可以解锁所有已发行pdf,还一个是用户密码,特定用户只能打开该用户的pdf文档。
02. 创建控制台
1、创建一个控制台应用程序。
03. 添加NeGet包
dotnet add package itext7
dotnet add itext7.bouncy-castle-adapte
04. 核心代码
using iText.Kernel.Pdf;
// 获取当前工作目录
string currentDirectory = Environment.CurrentDirectory;
Console.WriteLine("Current Directory: " + currentDirectory);
// 构建文件路径
string filePath = System.IO.Path.Combine(currentDirectory, "test.pdf");
Console.WriteLine("File Path: " + filePath);
// 检查文件是否存在
if (File.Exists(filePath))
{
#region pdf 加密
string outputencryptedwordfile = "encrypted_test.pdf";
string inputwordfile = "test.pdf";
try
{
// 用户密码和所有者密码
byte[] userPassword = System.Text.Encoding.UTF8.GetBytes("123456");
byte[] ownerPassword = System.Text.Encoding.UTF8.GetBytes("123456");
// 调用加密方法
EncryptPdfFile(inputwordfile, outputencryptedwordfile, userPassword, ownerPassword);
}
catch (Exception ex)
{
Console.WriteLine("加密过程中发生错误: " + ex.Message);
}
#endregion
}
else
{
Console.WriteLine("文件不存在");
}
static void EncryptPdfFile(string inputFile, string outputFile, byte[] userPassword, byte[] ownerPassword)
{
// 定义加密权限
int permissions = EncryptionConstants.ALLOW_PRINTING | EncryptionConstants.ALLOW_COPY;
// 创建 PdfWriter 并设置加密参数
WriterProperties writerProperties = new WriterProperties();
writerProperties.SetStandardEncryption(
userPassword,
ownerPassword,
permissions,
EncryptionConstants.ENCRYPTION_AES_128
);
// 打开输入 PDF 文件
using (PdfReader reader = new PdfReader(inputFile))
using (PdfWriter writer = new PdfWriter(outputFile, writerProperties))
using (PdfDocument pdfDoc = new PdfDocument(reader, writer))
{
// 复制页面(如果需要)
// for (int i = 1; i <= pdfDoc.GetNumberOfPages(); i++)
// {
// pdfDoc.CopyPagesTo(i, i, new PdfDocument(new PdfWriter(new MemoryStream())));
// }
}
}
05. 运行效果