目录
1、技术框架
2、代码实战
2.1 创建窗体
2.2 后台代码逻辑
2.3 PDF加密用户类型
2.4 PDF加密权限列表
3、运行效果
4、总结

大家日常办公中有时候为了文档资料的安全需要对文档进行加密,尤其是针对PDF文档这个场景还是非常广泛的。今天给大家分享使用C#来实现PDF文档加密功能。并且功能基于Winform窗体程序可以直接运行,感兴趣的朋友可以体验一下!
1、技术框架
开发工具:VS2019
框架:C#+iTextSharp+WinForm
iTextSharp 是 .NET 平台上的开源 PDF 处理库,支持文档创建、文本/图像添加、表单处理、密码保护、水印添加等功能。
2、代码实战
首先打开Visual Studio 2019 创建一个WinForm窗体程序项目。然后引入第三方iTextSharp类库版本5.5.10。这里直接使用nuget包直接安装。

2.1 创建窗体
界面主要有选择pdf文档按钮、pdf文档路径和pdf密码输入框以及PDF加密按钮。界面效果如下:

2.2 后台代码逻辑
加密pdf文档逻辑代码如下:
/// <summary>        /// 加密pdf文档        /// </summary>        /// <param name="inputPath">输入目录</param>        /// <param name="outputPath">输出目录</param>        /// <param name="userPassword">用户密码</param>        /// <param name="ownerPassword">所有者密码</param>        private void EncryptPdf(string inputPath, string outputPath, string userPassword, string ownerPassword)        {            using (FileStream input = new FileStream(inputPath, FileMode.Open, FileAccess.Read))            using (FileStream output = new FileStream(outputPath, FileMode.Create))            {                PdfReader reader = new PdfReader(input);                PdfStamper stamper = new PdfStamper(reader, output);                // 设置加密参数                int permissions = PdfWriter.AllowPrinting |                                 PdfWriter.AllowCopy |                                 PdfWriter.AllowScreenReaders |                                 PdfWriter.AllowModifyAnnotations;                // 加密文档 (128位加密)                stamper.SetEncryption(                    Encoding.UTF8.GetBytes(txtUserPassword.Text),                    Encoding.UTF8.GetBytes(txtOwnerPassowrd.Text),                    permissions,                    PdfWriter.ENCRYPTION_AES_128                );                stamper.Close();                reader.Close();            }        }选择PDF文档/// <summary>        /// 选择需要加密的PDF文档        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btnOpenFile_Click(object sender, EventArgs e)        {            openFileDialog1.Filter = "PDF文件|*.pdf";            if (openFileDialog1.ShowDialog() == DialogResult.OK)            {                txtInputPath.Text = openFileDialog1.FileName;            }        }加密文档点击事件/// <summary>        /// 加密按钮点击事件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void button1_Click(object sender, EventArgs e)        {            string inputFile = txtInputPath.Text;            string outputFile = Path.Combine(                Path.GetDirectoryName(inputFile),                Path.GetFileNameWithoutExtension(inputFile) + "_encrypted.pdf");            string userPassword = txtUserPassword.Text;            string ownerPassword = txtOwnerPassowrd.Text;            if (string.IsNullOrWhiteSpace(inputFile))            {                MessageBox.Show("请输入完整的PDF路径!");            }            else            {                if (!string.IsNullOrWhiteSpace(userPassword) && !string.IsNullOrWhiteSpace(ownerPassword))                {                    EncryptPdf(inputFile, outputFile, userPassword, ownerPassword);                }                else                {                    MessageBox.Show("用户密码和所有者密码均不能为空!");                }            }        }项目完整结构如下:

2.3 PDF加密用户类型
PDF加密用户类型分为userPassword和ownerPassword是两种不同权限的密码,主要区别如下:
用户密码(userPassword):用于限制文档的打开权限,用户输入该密码后只能进行只读操作(如查看内容),无法修改、打印或复制文档内容。
所有者密码(ownerPassword):用于获取完全控制权,通常用于文档的管理员或创建者,确保能自由编辑文档。
2.4 PDF加密权限列表
| 权限分类 | 常量名称 | 常量值 | 权限说明 | 
| 基础操作权限 | AllowPrinting | 2052 | 允许打印文档(低分辨率) | 
| AllowCopy | 16 | 允许复制文档内容(文字、图片) | |
| AllowModifyContents | 8 | 允许修改文档内容(需配合编辑密码) | |
| 高级功能权限 | AllowModifyAnnotations | 32 | 允许添加/修改注释、表单字段 | 
| AllowFillIn | 256 | 允许填写表单字段(交互式表单) | |
| AllowScreenReaders | 512 | 允许屏幕阅读器访问(无障碍模式) | |
| AllowAssembly | 1024 | 允许组装文档(插入/删除页面、添加书签) | |
| 特殊控制权限 | AllowDegradedPrinting | 4 | 允许低质量打印(仅适用于预览) | 
3、运行效果
运行主界面

选择PDF文档

输入用户密码和所有者密码信息

点击加密按钮,最终输出加密成功就可以了。

尝试打开PDF文档,效果如下:

输入密码就可以正常打开PDF文档了。

4、总结
以上是C#实现PDF文档加密功能的实战内容,功能比较简单。大家如果有问题的话可以评论区沟通交流!
 
                
 
                 
                 
                





 
                