java 在pdf中根据关键字位置插入图片(公章、签名等)

java 在pdf中根据关键字位置插入图片(公章、签名等)

1.使用依赖

		<dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.1.12</version><type>pom</type></dependency>

2.工具类

import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor;
import com.itextpdf.kernel.pdf.canvas.parser.listener.IPdfTextLocation;
import com.itextpdf.kernel.pdf.canvas.parser.listener.RegexBasedLocationExtractionStrategy;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.File;
import java.util.Collection;/*** @author dume* @ClassName Pdf* @description: TODO* @date 2024年07月03日* @version: 1.0*/
public class PdfUtisl {private static Logger logger = LoggerFactory.getLogger(PdfUtisl.class);public static void main(String[] args)  throws Exception {String input = "D:\\te1.pdf";//通过指定pdf文件名,指定关键字,和指定的pdf文件的待处理页数做参数getKeyWordsLocation("D:\\te1.pdf","D:\\1.png","签名:", 50d,50d,0d,0d);}/*** 得到关键字位置插入图片* @param sourcePath 源文件* @param imagePath 图片位置* @param KEY_WORD 关键字* @param width 图片宽度* @param height 图片高度* @param x 相对关键字平移x轴距离* @param y 相对关键字平移y轴距离*/public static boolean getKeyWordsAndInsertImg(String sourcePath,String imagePath, String KEY_WORD,float width,float height,float x,float y) {try {//得到需要插入的图片ImageData imageData = ImageDataFactory.create(imagePath);//核心思路为对PdfDocument对象采用某种Strategy,这里使用RegexBasedLocationExtractionStrategyPdfReader pr = new PdfReader(sourcePath);//临时路径String UUID= UUIDUtils.createUUID();String tempPath = sourcePath.replace(".pdf","_"+UUID+".pdf");//生成新的PDF文件PdfDocument pd = new PdfDocument(pr, new PdfWriter(tempPath));Document document = new Document(pd);int pageCount = pd.getNumberOfPages();boolean insertFlag = false;//遍历每一页for(int i = 1; i <= pageCount; i++){PdfPage page = pd.getPage(i);//查找页中的匹配文字,并定位到位置。RegexBasedLocationExtractionStrategy strategy = new RegexBasedLocationExtractionStrategy(KEY_WORD);PdfCanvasProcessor processor = new PdfCanvasProcessor(strategy);processor.processPageContent(page);Collection<IPdfTextLocation> resultantLocations = strategy.getResultantLocations();//自定义结果处理if (!resultantLocations.isEmpty()) {for (IPdfTextLocation item : resultantLocations) {Rectangle boundRectangle = item.getRectangle();System.out.println(item.getText());System.out.println("关键字“" + KEY_WORD + "” 的坐标为 x: " + boundRectangle.getX() + "  ,y: " + boundRectangle.getY());Image image = new Image(imageData).scaleAbsolute(width, height).setFixedPosition(i, boundRectangle.getRight() + x, boundRectangle.getBottom()+y);document.add(image);insertFlag = true;break;}}}document.close();pr.close();pd.close();if(insertFlag){logger.info("图片插入成功!");}else{logger.error("图片插入失败!");return false;}File oldfile = new File( sourcePath);oldfile.delete();boolean is = new File(tempPath).renameTo(new File(sourcePath));if(is){logger.info("文件重命名成功!");}else{logger.error("文件重命名失败!");return false;}} catch (Exception e) {e.printStackTrace();logger.error("读取文件插入图片失败!"+e.getMessage());return false;}return true;}}

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

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

相关文章

【深度学习】图形模型基础(7):机器学习优化中的方差减少方法(1)

摘要 随机优化是机器学习中至关重要的组成部分&#xff0c;其核心是随机梯度下降算法&#xff08;SGD&#xff09;&#xff0c;这种方法自60多年前首次提出以来一直被广泛使用。近八年来&#xff0c;我们见证了一个激动人心的新进展&#xff1a;随机优化方法的方差降低技术。这…

车载测试资料学习和CANoe工具实操车载项目(每日直播)

每日直播时间&#xff1a;&#xff08;直播方式&#xff1a;腾讯会议&#xff09; 周一到周五&#xff1a;20&#xff1a;00-23&#xff1a;00 周六与周日&#xff1a;9&#xff1a;00-17&#xff1a;00 向进腾讯会议学习的&#xff0c;可以关注我并后台留言 直播内容&#xff…

Simscape物理建模步骤

为了介绍构建和仿真物理模型的步骤&#xff0c;这里以simulink自带示例模型Mass-Spring-Damper with Controller为例&#xff0c;下图为建立好的模型。 详细物理建模和仿真分析步骤如下&#xff1a; 步骤 1&#xff1a;使用 ssc_new 创建新模型 使用 ssc_new 是开始构建 Sims…

李彦宏所说的卷应用到底是什么?

李彦宏在2024世界人工智能大会上的发言强调了一个重要的观点&#xff0c;那就是在AI时代&#xff0c;技术的应用比技术本身更为关键。他所提出的“卷应用”而非“卷模型”&#xff0c;实际上是在呼吁业界关注AI技术的实际落地和价值创造&#xff0c;而不是单纯地在模型精度或规…

【 RESTful API 】

RESTful API 是一种用于构建 web 应用程序的设计风格和架构模式。它提供了通过 HTTP 协议访问和操作资源的规范方式。 REST&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;它强调在网络中以资源的形式进行数据传输和状态管理。RESTfu…

Memcached与Redis:缓存解决方案的较量与选择

标题&#xff1a;Memcached与Redis&#xff1a;缓存解决方案的较量与选择 在现代应用架构中&#xff0c;缓存是提升性能的关键技术之一。Memcached和Redis作为两款流行的开源缓存解决方案&#xff0c;它们各自有着独特的特点和使用场景。本文将深入比较Memcached和Redis的特性…

案例|LabVIEW连接S7-1200PLC

附带&#xff1a; 写了好的参考文章&#xff1a; 通讯测试工具和博图仿真机的连接教程【内含图文完整过程软件使用】 解决博图V15 V16 V17 V18等高版本和低版本在同款PLC上不兼容的问题 目录 前言一、准备条件二、步骤1. HslCommunicationDemo问题1&#xff1a;连接失败?问题…

Lingo学习(二)——线性规划基础、矩阵工厂

一、线性规划基础 &#xff08;一&#xff09;方法 ① 一个线性规划中只含一个目标函数。(两个以上是多目标线性规划,Lingo无法直接解) ② 求目标函数的最大值或最小值分别用max …或min …来表示。 ③ 以!开头,以;结束的语句是注释语句; ④ 线性规划和非线性规划的本质…

Android11 MTK 状态栏添加无Sim卡图标

1、近日&#xff0c;查看测试提出的bug时&#xff0c;发现了一个问题&#xff0c;设备在未安装sim卡时&#xff0c;状态栏中不显示无sim卡的图标。 2、解决 路径&#xff1a;****\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBarSign…

01、Kerberos安全认证之原理及搭建命令使用学习笔记

文章目录 前言一、Kerberos原理1.1、数据安全防护&#xff08;kerberos所属的层次&#xff09;1.2、Kerberos介绍1.3、Kerberos名词介绍1.4、Kerberos术语1.5、Kerberos认证流程1.5.1、Kerberos流程图1.5.2、第一次通信&#xff1a;客户端与AS1.5.3、第二次通信&#xff1a;客户…

cpp使用第三方库

使用第三方库在C中进行编程是一种常见的做法&#xff0c;因为它可以让利用现成的代码来实现更复杂的功能&#xff0c;而不必从头开始编写。下面是一个示例&#xff0c;演示如何在C项目中引入并使用一个第三方库。这个例子将使用Boost库&#xff0c;它是C中广泛使用的一个库&…

60、基于浅层神经网络的数据拟合(matlab)

1、基于浅层神经网络的数据拟合的简介、原理以及matlab实现 1&#xff09;内容说明 基于浅层神经网络的数据拟合是一种常见的机器学习方法&#xff0c;用于通过输入数据来拟合一个非线性函数。这种方法通常包括一个输入层、一个或多个隐藏层和一个输出层。神经网络通过学习权…

广电日志分析系统

需求 广电集团中有若干个系统都产生日志信息&#xff0c;目前大约分布与70到80台服务器中&#xff0c;分别是windows与Linux操作系统。需要将服务器上产生的日志文件利用我们的技术进行解析 设计 每个日志工作站负责30-50个服务器的日志解析工作。可以根据实际需求进行设置&…

ENSP实现防火墙区域策略与用户管理

目录 实验拓扑与要求​编辑 交换机与防火墙接口的配置 交换机&#xff1a; 创建vlan 接口配置 防火墙配置及接口配置 防火墙IP地址配置 云配置​编辑​编辑​编辑 在浏览器上使用https协议登陆防火墙&#xff0c;并操作 访问网址&#xff1a;https://192.168.100.1:844…

51单片机嵌入式开发:9、 STC89C52RC 操作LCD1602技巧

STC89C52RC 操作LCD1602技巧 1 代码工程2 LCD1602使用2.1 LCD1602字库2.2 巧妙使用sprintf2.3 光标显示2.4 写固定长度的字符2.5 所以引入固定长度写入方式&#xff1a; 3 LCD1602操作总结 1 代码工程 承接上文&#xff0c;在原有工程基础上&#xff0c;新建关于lcd1602的c和h…

linux中如何设置多个redis进程并且设置独立密码?

在Linux中设置多个Redis进程&#xff08;实例&#xff09;并为每个实例设置独立密码&#xff0c;你需要为每个Redis实例配置不同的配置文件&#xff0c;并在这些配置文件中指定不同的端口、数据目录、密码等。Redis本身并不直接支持在配置文件中设置“密码”来阻止未授权访问&a…

ArduPilot开源飞控之AP_Mount_Backend_Serial

ArduPilot开源飞控之AP_Mount_Backend_Serial 1. 源由2. 框架设计2.1 类定义2.2 构造函数2.3 init 方法2.4 受保护成员 3. 重要方法4. 总结5. 参考资料 1. 源由 AP_Mount_Backend_Serial是AP_Mount_Backend基于串口的通信的一个扩展模版。 2. 框架设计 继承自 AP_Mount_Back…

Sentieon应用教程:本地使用-Quick_start

1、准备工作&#xff1a; License下载链接&#xff1a;http://www.sentieon.com/eula/b703e839c8c7c5b8fa73238277fd5da23a0276be54712edb46ee8f4d4f3d873fbf 软件下载地址&#xff1a; https://insvast-download.oss-cn-shanghai.aliyuncs.com/Sentieon/release/sentieon-gen…

11-《风信子》

风信子 风信子&#xff08;学名&#xff1a;Hyacinthus orientalis L.&#xff09;&#xff1a;是多年草本球根类植物&#xff0c;鳞茎卵形&#xff0c;有膜质外皮&#xff0c;皮膜颜色与花色成正相关&#xff0c;未开花时形如大蒜&#xff0c;原产地中海沿岸及小亚细亚一带&am…

【Vue】vue-element-admin组件化功能

1. 组件的封装 在vue-element-admin中&#xff0c;每个功能区域或UI元素都被封装成一个或多个Vue组件。这些组件可以是简单的按钮、输入框&#xff0c;也可以是复杂的表格、表单或页面布局。每个组件都包含了其模板&#xff08;HTML结构&#xff09;、逻辑&#xff08;JavaScr…