当前位置: 首页 > article >正文

实现PDF文档加密,访问需要密码

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. 运行效果

 

06. 缺点关注,互粉


http://www.kler.cn/a/417070.html

相关文章:

  • 数据结构(初阶7)---七大排序法(堆排序,快速排序,归并排序,希尔排序,冒泡排序,选择排序,插入排序)(详解)
  • LVS 负载均衡面试题及参考答案
  • RabbitMQ原理架构解析:消息传递的核心机制
  • 【目标跟踪】Anti-UAV数据集详细介绍
  • C++游戏开发入门:如何从零开始实现自己的游戏项目?
  • NeuIPS 2024 | YOCO的高效解码器-解码器架构
  • vue.js学习 (day 15)
  • 量化交易系统开发-实时行情自动化交易-8.2.发明者FMZ平台
  • rabbitMq两种消费应答失败处理方式
  • 制作苹果IOS.APP所使用步骤和方法-有步骤视情况待完善
  • 三维渲染中顺序无关的半透明混合(OIT)(二——Stencil Route)
  • 电脑文件自动提取器介绍
  • WEB攻防-通用漏洞XSS跨站绕过修复http_onlyCSP标签符号
  • 计算机毕业设计Python异常流量检测 流量分类 流量分析 网络流量分析与可视化系统 网络安全 信息安全 机器学习 深度学习
  • 家校通小程序实战教程04教师管理
  • 【DB】根据某字段生成序号
  • 一万台服务器用saltstack还是ansible?
  • 倍思无线蓝牙耳机测评:“静”只是它的闪光点之一!
  • Doge东哥wordpress主题
  • 爬虫XPath相关
  • Android笔记(三十四):封装带省略号图标结尾的TextView
  • 电机瞬态分析基础(6):坐标变换(续)
  • 从0到1搭建webpack
  • ESLint 配置文件全解析:格式、层叠与扩展(3)
  • 将大模型指令微调数据从parquet转为json格式
  • 大数据新视界 -- Hive 与其他大数据工具的集成:协同作战的优势(上)(13/ 30)