java word转pdf、word中关键字位置插入图片 工具类
java word转pdf、word中关键字位置插入图片 工具类
1.pom依赖
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.15</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.15</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.4</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.15</version>
2.依赖jar包
<dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>15.8.0</version><scope>system</scope><systemPath>${pom.basedir}/src/main/webapp/WEB-INF/lib/aspose-words-15.8.0-jdk16.jar</systemPath></dependency>
aspose-words是需要在我们项目中引入的,并且使用时要在resouces目录下导入license.xml文件,否则生成的文件抬头会有红色的license信息。
aspose-words-15.8.0-jdk16.jar 与license.xml
3.工具类
import com.aspose.words.*;
import com.aspose.words.Document;import org.apache.poi.xwpf.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;/*** @author dume* @ClassName WordToPdf* @description: TODO* @date 2024年07月02日* @version: 1.0*/public class WordUtils {private static Logger logger = LoggerFactory.getLogger(WordUtils.class);private static final String BASE_PATH = WordUtils.class.getClassLoader().getResource("").getPath();/*** Word转Pdf* @param sourcePath 原路径* @param targetPath 转出路径* @return*/public static boolean WordToPdf(String sourcePath,String targetPath){FileOutputStream os = null;try{// 验证License 若不验证则转化出的pdf文档会有水印产生if (!getLicense()) {logger.info("license验证失败");return false;}File file = new File(targetPath);os = new FileOutputStream(file);FontSettings.setFontsFolder(BASE_PATH, true);FontSettings.setDefaultFontName("STFANGSO");Document doc = new Document(sourcePath);doc.save(os, SaveFormat.PDF);os.flush();os.close();}catch (Exception e){e.printStackTrace();logger.error(e.getMessage());return false;}finally {if(os!=null){try{os.close();}catch (Exception e){}}}return true;}/*** word中插入图片方法* @param sourcePath word路径* @param imgPath 图片路径* @param keyWords 关键字* @return 插入是否成功*/public static boolean InsertImg(String sourcePath,String imgPath,String keyWords){try{// 验证License 若不验证则转化出的pdf文档会有水印产生if (!getLicense()) {logger.info("license验证失败");return false;}Document doc = new Document(sourcePath);DocumentBuilder builder = new DocumentBuilder(doc);//插入图片的方法NodeCollection runs = doc.getChildNodes(NodeType.PARAGRAPH, true);for (int i = 0; i < runs.getCount(); i++) {Node r = runs.get(i);String text = r.getText();//获取键if(text.contains(keyWords)){//锁定到当前段落即实现页面变换builder.moveTo(r);builder.insertImage(imgPath, RelativeHorizontalPosition.PAGE, 205, RelativeVerticalPosition.PAGE, 0, 20, 7, WrapType.INLINE);break;}}doc.save(sourcePath);}catch (Exception e){e.printStackTrace();logger.error(e.getMessage());return false;}return true;}public static boolean getLicense() {boolean result = false;try {FileInputStream is = new FileInputStream (BASE_PATH+"license.xml");License asposeLicense = new License();asposeLicense.setLicense(is);result = true;} catch (Exception e) {e.printStackTrace();}return result;}/**** @Description :替换段落文本* @param document docx解析对象* @param textMap 需要替换的信息集合* @return void*/public static void changeText(XWPFDocument document, Map<String, Object> textMap) {// 获取段落集合Iterator<XWPFParagraph> iterator = document.getParagraphsIterator();XWPFParagraph paragraph = null;while (iterator.hasNext()) {paragraph = iterator.next();// 判断此段落是否需要替换if (checkText(paragraph.getText())) {replaceValue(paragraph, textMap);}}}/**** @Description :替换表格内的文字* @param document* @param data* @return void*/public static void changeTableText(XWPFDocument document, Map<String, Object> data) {// 获取文件的表格Iterator<XWPFTable> tableList = document.getTablesIterator();XWPFTable table;List<XWPFTableRow> rows;List<XWPFTableCell> cells;// 循环所有需要进行替换的文本,进行替换while (tableList.hasNext()) {table = tableList.next();if (checkText(table.getText())) {rows = table.getRows();// 遍历表格,并替换模板for (XWPFTableRow row : rows) {cells = row.getTableCells();for (XWPFTableCell cell : cells) {// 判断单元格是否需要替换if (checkText(cell.getText())) {List<XWPFParagraph> paragraphs = cell.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {replaceValue(paragraph, data);}}}}}}}/**** @Description :检查文本中是否包含指定的字符(此处为“$”)* @param text* @return boolean*/public static boolean checkText(String text) {boolean check = false;if (text.contains("$")) {check = true;}return check;}/**** @Description :替换内容* @param paragraph* @param textMap* @return void*/public static void replaceValue(XWPFParagraph paragraph, Map<String, Object> textMap) {XWPFRun run, nextRun;String runsText;List<XWPFRun> runs = paragraph.getRuns();for (int i = 0; i < runs.size(); i++) {run = runs.get(i);runsText = run.getText(0);if (runsText.contains("${") || (runsText.contains("$") && runs.get(i + 1).getText(0).substring(0, 1).equals("{"))) {while (!runsText.contains("}")) {nextRun = runs.get(i + 1);runsText = runsText + nextRun.getText(0);//删除该节点下的数据paragraph.removeRun(i + 1);}Object value = changeValue(runsText, textMap);//判断key在Map中是否存在String replaceText = runsText.replace("${", "").replace("}", "");if (textMap.containsKey(replaceText)) {run.setText(value.toString(), 0);} else {//如果匹配不到,则不修改run.setText(runsText, 0);}}}}/**** @Description :匹配参数* @param value* @param textMap* @return java.lang.Object*/public static Object changeValue(String value, Map<String, Object> textMap) {Object valu = "";for (Map.Entry<String, Object> textSet : textMap.entrySet()) {// 匹配模板与替换值 格式${key}String key = textSet.getKey();if (value.contains(key)) {valu = textSet.getValue();}}return valu;}}
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
java word转pdf、word中关键字位置插入图片 工具类
java word转pdf、word中关键字位置插入图片 工具类 1.pom依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dependency><dependency><groupId>org.apa…...
![](https://www.ngui.cc/images/no-images.jpg)
jail内部ubuntu apt升级失败问题解决
在FreeBSD jail 里安装启动Ubuntu jammy系统,每次装好执行jexec ubjammy sh进入Ubuntu系统后,执行apt update报错。 这个问题困惑了好久,突然有一天仔细去看报错信息,查看了(man 5 apt.conf) ,才搞定问题。简单来说就是…...
![](https://www.ngui.cc/images/no-images.jpg)
迎接AI新时代:GPT-5的技术飞跃与未来展望
引言 随着人工智能技术的迅猛发展,大语言模型在过去几年取得了显著进步。OpenAI最新的声明表明,GPT-5将在一年半后发布,并将带来从高中生智力水平到博士生智力水平的飞跃。这一突破引起了科技界和公众的广泛关注。本文将从技术突破预测、智能…...
![](https://i-blog.csdnimg.cn/direct/2e921c8ae0044e9e94371042dd58f5c5.png)
Snap Video:用于文本到视频合成的扩展时空变换器
图像生成模型的质量和多功能性的显著提升,研究界开始将其应用于视频生成领域。但是视频内容高度冗余,直接将图像模型技术应用于视频生成可能会降低运动的保真度和视觉质量,并影响可扩展性。来自 Snap 的研究团队及其合作者提出了 "Snap …...
![](https://i-blog.csdnimg.cn/direct/745065f87d8f4f1f889ea2f1395b8848.png)
实验8 视图创建与管理实验
一、实验目的 理解视图的概念。掌握创建、更改、删除视图的方法。掌握使用视图来访问数据的方法。 二、实验内容 在job数据库中,有聘任人员信息表:Work_lnfo表,其表结构如下表所示: 其中表中练习数据如下: 1.‘张明…...
![](https://www.ngui.cc/images/no-images.jpg)
C++ 开源库
1 PDFium PDFium 是一个开源的 PDF 渲染和处理库,最初由 Foxit Software 开发,并于2014年捐赠给了 Chromium 项目。PDFium 旨在为各种应用程序提供高效、灵活的 PDF 渲染和操作功能。 2 代码地址 https://github.com/chromium/pdfium 主要特性 渲染…...
![](https://img-blog.csdnimg.cn/img_convert/c2873311cdfc021e20b97228dfa8d519.png)
LabVIEW滤波器性能研究
为了研究滤波器的滤波性能,采用LabVIEW设计了一套滤波器性能研究系统。该系统通过LabVIEW中的波形生成函数,输出幅值及频率可调的正弦波和白噪声两种信号,并将白噪声与正弦波叠加,再通过滤波器输出纯净的正弦波信号。系统通过FFT&…...
![](https://i-blog.csdnimg.cn/direct/64abcbdee4c14a96a052617e9473b2f6.gif)
『C++成长记』vector模拟实现
🔥博客主页:小王又困了 📚系列专栏:C 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、存储结构 二、默认成员函数 📒2.1构造函数 📒2.2拷贝…...
![](https://img-blog.csdnimg.cn/img_convert/f859574b1e328fd1f64647251c04c2ab.png)
【Mac】Charles for Mac(HTTP协议抓包工具)及同类型软件介绍
软件介绍 Charles for Mac 是一款功能强大的网络调试工具,主要用于HTTP代理/HTTP监视器。以下是它的一些主要特点和功能: 1.HTTP代理:Charles 可以作为HTTP代理服务器,允许你查看客户端和服务器之间的所有HTTP和SSL/TLS通信。 …...
![](https://i-blog.csdnimg.cn/direct/b3e1af9122254787a6c47793fe398ec1.png)
LVS集群及其它的NAT模式
1.lvs集群作用:是linux的内核层面实现负载均衡的软件;将多个后端服务器组成一个高可用、高性能的服务器的集群,通过负载均衡的算法将客户端的请求分发到后端的服务器上,通过这种方式实现高可用和负载均衡。 2.集群和分布式&#…...
![](https://i-blog.csdnimg.cn/direct/5f7e6f497ed849f593f31b23e099ef19.png)
【RNN练习】天气预测
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、环境及数据准备 1. 我的环境 语言环境:Python3.11.9编译器:Jupyter notebook深度学习框架:TensorFlow 2.15.0 2. 导…...
![](https://www.ngui.cc/images/no-images.jpg)
prompt第四讲-fewshot
文章目录 前提回顾FewShotPromptTemplateforamt格式化 前提回顾 前面已经实现了一个翻译助手了[prompt第三讲-PromptTemplate],prompt模板设计中,有说明、案例、和实际的问题 # -*- coding: utf-8 -*- """ Time : 2024/7/8 …...
![](https://img-blog.csdnimg.cn/img_convert/7faffd132ec8fa9744e256c58ae26437.png)
StarRocks分布式元数据源码解析
1. 支持元数据表 https://github.com/StarRocks/starrocks/pull/44276/files 核心类:LogicalIcebergMetadataTable,Iceberg元数据表,将元数据的各个字段做成表的列,后期可以通过sql操作从元数据获取字段,这个表的组成…...
![](https://i-blog.csdnimg.cn/direct/0786921b3238487387d4e39185af182a.png)
阅读笔记——《Fuzz4All: Universal Fuzzing with Large Language Models》
【参考文献】Xia C S, Paltenghi M, Le Tian J, et al. Fuzz4all: Universal fuzzing with large language models[C]//Proceedings of the IEEE/ACM 46th International Conference on Software Engineering. 2024: 1-13.【注】本文仅为作者个人学习笔记,如有冒犯&…...
![](https://www.ngui.cc/images/no-images.jpg)
【C++】使用gtest做单元测试框架写单元测试
本文主要介绍在将gtest框架引入到项目里过程中遇到的问题。 我的需求如下: 用CMake构建项目。我要写一些测试程序验证某些功能,但是不想每一个测试都新建一个main函数。 因为新建一个main函数就要在CMakeList.txt里增加一个project,非常不方便。 于是我搜了下,C++里有没…...
![](https://i-blog.csdnimg.cn/direct/fd7f687793e44991b3c61b15cebd5518.png)
Java类与对象
类是对现实世界中实体的抽象,是对一类事物的描述。 类的属性位置在类的内部、方法的外部。 类的属性描述一个类的一些可描述的特性,比如人的姓名、年龄、性别等。 [public] [abstract|final] class 类名 [extends父类] [implements接口列表] { 属性声…...
![](https://www.ngui.cc/images/no-images.jpg)
xlwings 链接到 指定sheet 从别的 excel 复制 sheet 到指定 sheet
重点 可以参考 宏录制 cell sheet.range(G4)cell.api.Hyperlinks.Add(Anchorcell.api, Address"", SubAddress"001-000-02301!A1")def deal_excel(self):with xw.App(visibleTrue) as app:wb app.books.open(self.summary_path, update_linksFalse)sheet…...
![](https://i-blog.csdnimg.cn/direct/5dc64e786ae343a596b61d546b8989cf.png)
风光摄影:相机设置和镜头选择
写在前面 博文内容为《斯科特凯尔比的风光摄影手册》读书笔记整理涉及在风景拍摄中一些相机设置,镜头选择的建议对小白来讲很实用,避免拍摄一些过曝或者过暗的风景照片理解不足小伙伴帮忙指正 😃,生活加油 99%的焦虑都来自于虚度时间和没有好…...
![](https://i-blog.csdnimg.cn/direct/08eb1c4883bb4bc99062b424f601c6f5.png)
python制作甘特图的基本知识(附Demo)
目录 前言1. matplotlib2. plotly 前言 甘特图是一种常见的项目管理工具,用于表示项目任务的时间进度 直观地看到项目的各个任务在时间上的分布和进度 常用的绘制甘特图的工具是 matplotlib 和 plotly 主要以Demo的形式展示 1. matplotlib 功能强大的绘图库&a…...
![](https://www.ngui.cc/images/no-images.jpg)
javascript设计模式总结
参考 通过设计模式可以增加代码的可重用性、可扩展性、可维护性 设计模式五大设计原则 单一职责:一个程序只需要做好一件事,如果结构过于复杂就拆分开,保证每个部分独立 开放封闭原则:对扩展开放,对修改封闭。增加需…...
![](https://i-blog.csdnimg.cn/direct/efa7a173ab774b9482e106cc99c71f31.png)
gpt-4o看图说话-根据图片回答问题
问题:中国的人口老龄化究竟有多严重? 代码下实现如下:(直接调用openai的chat接口) import os import base64 import requests def encode_image(image_path): """ 对图片文件进行 Base64 编码 输入…...
![](https://www.ngui.cc/images/no-images.jpg)
【MySQL】7.MySQL 的内置函数
MySQL的内置函数 一.日期函数二.字符串函数三.数学函数四.其它函数 一.日期函数 函数名称说明current_date()当前日期current_time()当前时间current_timestamp当前时间戳(日期时间)date(datetime)截取 datetime 的日期部分date_add(date, interval d_value_type)给 date 添加…...
![](https://www.ngui.cc/images/no-images.jpg)
爬虫:Sentry-Span参数逆向
在抓某眼查数据太过频繁时会出现极验的验证码。极验的教程有很多,主要是发现在这里获取验证码的时候需要携带参数Sentry-Span。在这里记录一下逆向的主要过程,直接上补环境的代码。 window global; location {}; my_log console.log;(function () {l…...
![](https://www.ngui.cc/images/no-images.jpg)
音视频入门基础:H.264专题(12)——FFmpeg源码中通过SPS属性计算视频分辨率的实现
一、引言 在上一节《音视频入门基础:H.264专题(11)——计算视频分辨率的公式》中,讲述了通过SPS中的属性计算H.264编码的视频的分辨率的公式。本文讲解FFmpeg源码中计算视频分辨率的实现。 二、FFmpeg源码中计算视频分辨率的实现…...
![](https://i-blog.csdnimg.cn/direct/22596d8b1b064898925d6830c4d82fbf.jpeg)
基于颜色模型和边缘检测的火焰识别FPGA实现,包含testbench和matlab验证程序
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 将FPGA仿真结果导入到matlab显示结果: 测试样本1 测试样本2 测试样本3 2.算法运行软件版本 vivado2019.2 …...
![](https://i-blog.csdnimg.cn/direct/6dcfaaf967f447908f935c2681f651b6.png)
golang json反序列化科学计数法的坑
问题背景 func CheckSign(c *gin.Context, signKey string, singExpire int) (string, error) {r : c.Requestvar formParams map[string]interface{}if c.Request.Body ! nil {bodyBytes, _ : io.ReadAll(c.Request.Body)defer c.Request.Body.Close()if len(bodyBytes) >…...
![](https://i-blog.csdnimg.cn/direct/21c7cf9904904c4a9c1b4452585435bc.png)
罗技K380无线键盘及鼠标:智慧互联,一触即通
目录 1. 背景2. K380无线键盘连接电脑2.1 键盘准备工作2.2 电脑配置键盘的连接 3. 无线鼠标的连接3.1 鼠标准备工作3.2 电脑配置鼠标的连接 1. 背景 有一阵子经常使用 ipad,但是对于我这个习惯于键盘打字的人来说,慢慢在 ipad 上打字,实在是…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8)
卸载wps office的几种方法收录
第一种方法: 1.打开【任务管理器】,找到相关程序,点击【结束任务】。任务管理器可以通过左下角搜索找到。 2.点击【开始】-【设置】-【应用】-下拉找到WPS应用,右键卸载,不保留软件配置 …...
![](https://i-blog.csdnimg.cn/direct/0c5f2932d4c347e2b072ae17fb1d152e.png)
SpringCloud第一篇Docker基础
文章目录 一、常见命令二、数据卷三、数据挂载四、自定义镜像五、网络 一、常见命令 Docker最常见的命令就是操作镜像、容器的命令,详见官方文档: https://docs.docker.com/ 需求: 在DockerHub中搜索Nginx镜像,查看镜像的名称 …...
![](https://i-blog.csdnimg.cn/direct/a52a9e00e1354ce4b0994a2ca32021a3.png)
从零开始学习PX4源码3(如何上传官网源码到自己的仓库中)
目录 文章目录 目录摘要1.将PX4源码上传至腾讯工蜂2.从腾讯工蜂克隆源码到本地ubuntu3.如何查看自己源码的版本信息 摘要 本节主要记录从零开始学习PX4源码3(如何上传官网源码到自己的仓库中)及如何查看PX4的固件版本信息,欢迎批评指正! PX4源码版本V1.…...
![](https://img-blog.csdnimg.cn/cec41efe6c9545759da2655555b5795a.png)
wordpress 更换语言包/营销推广主要包括
参数是10,显示是100效果如下: {{ a,b | filterB }} 表示a和b分别作为参数传给filterB 1、局部过滤器 方式一 关键性代码 <div> {{ 10 | getNum(20) }} </div><!--10是第一个参数,20是第二个参数,如果只有一个参数…...
![](/images/no-images.jpg)
如何优化好一个网站/seo推广哪家公司好
百度,google1. 依靠拼音进行纠错2. 容易读错的拼音词进行纠错(bin-->bing,掉diao念-->悼dao念)3. 一些特别字出来4. 按照热门优先提示英文搜索按照空格进行分词 1. 缩写问题2. 词态问题 3. 容错问题 转载于:https://www.cn…...
![](https://img-blog.csdnimg.cn/img_convert/9e4c72ef6559356f4f0818ba0d2798b2.png)
杭州网站建设公司有哪几家/陕西网站建设网络公司
基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。更多交流私我132-陆零伍陆-20-291、μClinuxμClinux是一种优秀的…...
![](/images/no-images.jpg)
设计网站推荐p/电商运营模式
0、认识 rpm包和deb包是两种Linux系统下最常见的安装包格式,在安装一些软件或服务的时候免不了要和它们打交道。 rpm包主要应用在RedHat系列包括 Fedora等发行版的Linux系统上, deb包主要应用于Debian系列包括现在比较流行的Ubuntu等发行版上。 我们知道…...
![](https://images2015.cnblogs.com/blog/808527/201511/808527-20151112224554634-383982244.png)
响应式网站和/深圳百度代理
13物联网 201306104132 柴铱琳 一、 实验目的 (1)加深对作业调度算法的理解; (2)进行程序设计的训练。 二、 实验内容和要求 用高级语言编写一个或多个作业调度的模拟程序。 单道批处理系统的作业调度程序。作业一投入…...
![](/images/no-images.jpg)
护理学院网站建设/网页seo优化
安装selenium和python等软件尽量安装为默认安装途径...