掌握iText:轻松处理PDF文档-高级篇-加密和解密

前言


iText作为一个功能强大、灵活且广泛应用的PDF处理工具,在实际项目中发挥着重要作用。通过这些文章,读者可以深入了解如何利用iText进行PDF的创建、编辑、加密和提取文本等操作,为日常开发工作提供了宝贵的参考和指导。

掌握iText:轻松处理PDF文档-基础篇-CSDN博客

掌握iText:轻松处理PDF文档-进阶篇-CSDN博客

掌握iText:轻松处理PDF文档-高级篇-添加水印-CSDN博客

掌握iText:轻松处理PDF文档-高级篇-加密和解密-CSDN博客

需求描述

给pdf文档加密和解密

iText的依赖

在maven的pom.xml中配置:

这里需要注意的是:增加了一个java的加密库,即bcprov-jdk15on。

bcprov-jdk15on是一个Java加密库,它提供了用于加密、解密、签名、验证和其他安全操作的API和实现。它是由Bouncy Castle项目提供的,旨在扩展Java的加密功能。

该库支持多种加密算法和协议,包括对称加密(如AES、DES)、非对称加密(如RSA、DSA)、哈希函数(如SHA-1、SHA-256)以及数字签名(如PKCS#7、CMS)。此外,它还提供了对X.509证书的支持,可以用于处理与数字证书相关的操作。

<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version>
</dependency>
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.68</version>
</dependency>

加密

  1. 创建一个空白的Document对象,该对象用于创建PDF文档。
  2. 创建PdfWriter对象,用于将文档内容写入到PDF文件中,并指定输出文件路径("e:/pdf-test/test-v4.pdf")。
  3. 使用PdfWriter的setEncryption方法设置加密算法和用户/所有者密码。其中,"yzxa001"是用户/所有者密码,PdfWriter.ALLOW_PRINTING表示允许打印文档,PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA表示使用AES-128位加密算法,并且不加密文档的元数据。
  4. 打开文档。
  5. 向文档中添加一个段落,内容为"This is an encrypted PDF document."。
  6. 关闭文档。

这段代码的目的是创建一个加密的PDF文档,并向文档中添加一些内容。通过使用PdfWriter的setEncryption方法,可以对PDF文档进行加密,设置用户/所有者密码以及加密算法和权限。

需要注意的是,这里使用的是AES-128位加密算法,允许打印文档,但不加密文档的元数据。如果需要其他加密选项,请参考相关文档。

@Test
public void test4() {Document document = new Document();try {// 设置加密算法和用户/所有者密码PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("e:/pdf-test/test-v4.pdf"));writer.setEncryption("yzxa001".getBytes(), "yzxa001".getBytes(),PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA);document.open();// 添加一些内容到文档中document.add(new Paragraph("This is an encrypted PDF document."));document.close();} catch (DocumentException | IOException e) {e.printStackTrace();}}

加密后效果:

解密

  1. 创建了一个PdfReader对象pdfReader,用于读取指定路径的PDF文件。在创建PdfReader对象时,使用了密码"yzxa001".getBytes()进行解密。
  2. 获取PDF文件的总页数,并保存到变量numberOfPages中。
  3. 使用for循环遍历PDF文件的每一页,从每一页中提取文本内容。
  4. 使用PdfTextExtractor.getTextFromPage方法从每一页中提取文本,并将提取的文本内容打印到控制台上。
  5. 如果在读取PDF文件时发生IOException异常,将其转换为RuntimeException并抛出。

总体来说,这段代码的目的是读取加密的PDF文件"e:/pdf-test/test-v4.pdf",并使用指定的密码进行解密,然后逐页提取文本内容并输出到控制台。

@Test
public void test5() {try {String fileName = "e:/pdf-test/test-v4.pdf";PdfReader pdfReader = new PdfReader(fileName, "yzxa001".getBytes());int numberOfPages = pdfReader.getNumberOfPages();for (int i = 0; i < numberOfPages; i++) {String text = PdfTextExtractor.getTextFromPage(pdfReader, i + 1);System.out.println(text);}} catch (IOException e) {throw new RuntimeException(e);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/217050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue】router.push用法实现路由跳转

目录 router.push用法 在Login.vue中 在Register.vue中 ​ 上一篇&#xff1a;登录与注册界面的制作 https://blog.csdn.net/m0_67930426/article/details/134895214?spm1001.2014.3001.5502 制作了登录与注册界面&#xff0c;并介绍了相关表单元素即属性的用法 在登录页面…

Docker笔记:关于Dockerfile及构建镜像

Dockerfile 的作用 Dockerfile让docker命令变得更简单&#xff0c;是用于构建docker镜像&#xff0c;实现自动化部署 Dockerfile 构建自己的centos镜像 这里有一个应用场景&#xff0c;创建一个自己的centos镜像&#xff0c;这个镜像有我们所需的软件 可以将我们一系列的操作…

人大金仓V8R6进阶授权操作

授权用户myuser在模式myschema 单表的所有权限 GRANT ALL ON TABLE "myschema"."mytable" to "myuser"; 授权用户myuser在模式myschema 单表的查询权限 GRANT SELECT ON TABLE "myschema"."mytable" to "myuser";…

jQuery遍历与删除添加节点

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

手拉手探索JSONCrack数据可视化

JSON Crack数据可视化工具 官网&#xff1a;https://jsoncrack.com/ 项目地址&#xff1a;https://github.com/AykutSarac/jsoncrack.com SON Crack 是一个很方便的 JSON 数据可视化工具。 该项目不是简单的展示 JSON 数据,而是将其转化为类似思维导图的形式,支持放大/缩小、展…

技术资讯:VSCode大更新,这两个功能终于有了

大家好&#xff0c;我是大澈&#xff01; 本文约1200字&#xff0c;整篇阅读大约需要2分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01; 1. 资讯速览 就在前阵子&#xff0c;前端人都…

gcc的编译过程

gcc编译过程包括预处理&#xff0c;编译&#xff0c;汇编&#xff0c;链接。 &#xff08;1&#xff09;预处理 预处理就是对文件中带#内容的处理&#xff0c;包括宏定义&#xff0c;条件编译和头文件。 可以通过gcc -E <file> -o xxx.i 来进行预处理 查看.i 文件可发现…

Java LeetCode篇-二叉树经典解法(实现:判断平衡二叉树、找两个节点最近的祖先等)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 平衡二叉树 1.1 实现判断平衡二叉树的思路 1.2 代码实现判断平衡二叉树 2.0 二叉树的层序遍历 2.1 实现二叉树层序遍历的思路 2.2 代码实现二叉树层序遍历 3.0 …

【ITK库学习】使用itk库进行图像滤波ImageFilter:模糊降噪

目录 1、itkDiscreteGaussianImageFilter 离散高斯2、itkBinomialBlurImageFilter 二项式模糊3、itkSmoothingRecursiveGaussianImageFilter 图像模糊可以削弱图像频谱的高频部门 1、itkDiscreteGaussianImageFilter 离散高斯 该类通过图像与离散高斯算子&#xff08;内核&…

苹果app应用ipa文件程序开发后如何运行到苹果iOS真机上测试?

在苹果应用程序开发过程中&#xff0c;将app安装于真机进行测试是一个不可或缺的步骤&#xff0c;它可以帮助你检测app在实际设备上的性能表现及存在的潜在问题。这篇文章将详细阐述如何将开发好的苹果app&#xff08;.ipa文件&#xff09;安装到真机上进行测试。 图片来源&…

文心一言 VS 讯飞星火 VS chatgpt (155)-- 算法导论12.3 2题

二、用go语言&#xff0c;假设通过反复向一棵树中插人互不相同的关键字来构造一棵二叉搜索树。证明&#xff1a;在这棵树中查找关键字所检查过的结点数目等于先前插入这个关键字所检查的结点数目加 1。 文心一言&#xff1a; 为了证明这个结论&#xff0c;我们可以使用二叉搜…

VisualSVN Server的安装全过程

目录 背景: 安装过程&#xff1a; 步骤1&#xff1a; 步骤2&#xff1a; 步骤3&#xff1a; 步骤4&#xff1a; 步骤5&#xff1a; 安装出现的bug&#xff1a; 问题: 解决办法: 总结: 背景: VisualSVN Server 是一款免费的 SVN (Subversion) 服务器软件&#xff0c…

2创建工程及点灯

1:软件安装&#xff1a; 1关注公众号“纸飞资”&#xff0c;键盘输入keil“”,按照文章要求安装编译软件 2芯片安装&#xff1a; 方式一&#xff1a;离线安装。去Keil公司官网的器件支持包下载页面选择对应的公司及器件型号&#xff0c;然后在Device Family Pack文本框中点击…

Python异常、模块和包

Python异常、模块和包 1.了解异常2.异常的捕获方法3.异常的传递4.Python模块5.Python包 1.了解异常 1.1什么是异常 当检测到一个错误是&#xff0c;Python解释器就无法继续执行了&#xff0c;发而出现了一些错误提示&#xff0c;这就是所谓的“异常”&#xff0c;也就是我们常…

二叉树的最大深度(力扣

int maxDepth(struct TreeNode* root) {if(!root) return 0;return fmax(maxDepth(root->left),maxDepth(root->right))1; }

【开源软件】最好的开源软件-2023-第26名 Accelerate

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

PHP的最新版本是多少?有什么新特性?

截至日期&#xff08;2022年1月&#xff09;&#xff0c;PHP的最新稳定版本是PHP 8.0。以下是PHP 8.0的一些主要新特性&#xff1a; JIT 编译器&#xff1a; 引入了即时编译&#xff08;Just-In-Time&#xff0c;JIT&#xff09;引擎&#xff0c;提升了PHP脚本的执行性能。 命…

可以操作Access的ORM工具,MS Access日期的坑

可以操作Access的ORM工具&#xff0c;MS Access日期的坑 MS Access日期可以查询返回&#xff1b; 但作为参数&#xff0c;不能过滤成功&#xff0c;则试了三种日期类型都不可以; MS Access日期作为入参&#xff0c;在驱动官网找相关资料&#xff0c;找不到实例&#xff1b; …

【精选】小白是如何挖漏洞的(技巧篇)

目录&#xff1a; 怎么找漏洞 找到后如何挖漏洞 关于通杀漏洞N day漏洞的挖掘 漏洞如何提交 每小结都有提供对应的案例&#xff0c;简直不要太nice&#xff01; 这个月的SRC活动也快开始了&#xff0c;看到群里的小伙伴在问如何找漏洞&#xff0c;SQL注入的漏洞咋找&#x…

理解并使用React的有状态组件和无状态组件

在React中&#xff0c;有状态组件和无状态组件是两种基本的组件类型&#xff0c;它们在特性和使用场景上有所不同。本文将深入探讨这两种组件类型的理解及使用场景。 一、有状态组件 特点&#xff1a; 类组件&#xff1a;React中的有状态组件通常是使用ES6的类语法来定义的。…