java实现模板填充word,word转pdf,pdf转图片

Java实现Word转PDF及PDF转图片

在日常开发中,我们经常需要将文件操作,比如:

  1. 根据模板填充word
  2. word文档中插入图片
  3. Word文档转换为PDF格式
  4. 将PDF文件转换为图片。
    这些转换可以帮助我们在不同的场景下展示或处理文档内容。下面,我将介绍如何使用Java来实现这两个功能。

要实现模板填充word,我们可以使用Apache POI和poi-tl库。Apache POI用于读取Word文档内容,而poi-tl则用于填充模板文件。

1. 添加依赖

		<!-- 模板填充word 注意 poi-tl 与 pio 两个版本号要相互对应,不然会抛异常版本不一致 --><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version></dependency><!-- word 转 pdf --><dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.0.3</version></dependency><dependency><groupId>com.documents4j</groupId><artifactId>documents4j-transformer-msoffice-word</artifactId><version>1.0.3</version></dependency><!-- pdf转图片 --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.25</version></dependency><!-- 其他工具 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency>

2. 编写转换代码

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.PictureType;
import com.deepoove.poi.data.Pictures;
import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;/*** @author lqf* @date 2024/04/28 11:09*/
public class startDemo001 {public static void main(String[] args) throws IOException {String filePath = "D:\\data\\muban2.docx";String targetPath =  "D:\\data\\do1.docx";Map<String,Object> map = new HashMap<>();map.put("tile", "使用Word模板");map.put("details", "打开Word2010文档窗口,依次单击“文件”→“新建”按钮");map.put("time", "2024-04-28");// 添加网络图片URL url = new URL("https://img-blog.csdnimg.cn/direct/1e85d3ac1f64415bbc965cba7ba1f8d9.png");//打开连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();//设置请求方式为"GET"conn.setRequestMethod("GET");//超时响应时间为10秒conn.setConnectTimeout(10 * 1000);//通过输入流获取图片数据 如果是本地图片,将网络请求换成本地文件流即可InputStream is = conn.getInputStream();PictureRenderData pictureRenderData = Pictures.ofStream(is, PictureType.PNG).size(100, 50).create();map.put("img", pictureRenderData);writForTemplate(filePath, targetPath, map);String pdfPath = "D:\\data\\do1.pdf";wordConvertPdf(targetPath, pdfPath);// 一个pdf可能会输出多个图片,所以这儿是图片文件夹路径pdfFileToImages(pdfPath, "D:\\data");}/*** 在Word模版中写入指定内容* @param filePath      模版文件地址* @param targetPath    生成文件的目标地址* @param map           填充内容* @throws IOException*/public static void writForTemplate(String filePath, String targetPath, Map<String,Object> map) throws IOException {XWPFTemplate template = XWPFTemplate.compile(filePath).render(map);template.writeAndClose(Files.newOutputStream(Paths.get(targetPath)));}/**** @param wordPath          word 文件路径* @param pdfPath           pdf 输出路径* @throws IOException*/public static void wordConvertPdf(String wordPath, String pdfPath) throws IOException {InputStream wordInputStream = Files.newInputStream(Paths.get(wordPath));// 转成 pdfOutputStream outputStream = Files.newOutputStream(Paths.get(pdfPath));IConverter converter = LocalConverter.builder().build();converter.convert(wordInputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute();converter.shutDown();}/*** pdf 转 png 图片* @param filePath          pdf文件路径* @param imgDirPath         存储图片文件夹路径,一个pdf可能会输出多个图片,所以这儿是图片文件夹路径*/public static void pdfFileToImages(String filePath, String imgDirPath) {try {File pdfFile = new File(filePath);String name = pdfFile.getName();String imgName = name.substring(0, name.indexOf("."));PDDocument pd = PDDocument.load(pdfFile);PDFRenderer pdfRenderer = new PDFRenderer(pd);for (int page = 0; page < pd.getNumberOfPages(); ++page) {BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);//将图片数据保存为PNG格式文档File file= new File(imgDirPath + "\\" + imgName + "_" + page + ".png");if (file.exists() ) {boolean newFile = file.createNewFile();}ImageIO.write(image, "png", file);System.out.println(file.getAbsolutePath());}}  catch (Exception e) {e.printStackTrace();}}
}

3. 测试使用的 word 模板内容

3.1 {{tile}}: 双大括号为文本占位符
3.2 {{@img}}: 双大括号中加上@为图片占位符
3.3 示例:

{{tile}}
在Word2010中使用模板创建文档的方法:
第1步,{{details}}。
第2步,在打开的“新建”面板中,用户可以单击“博客文章”、“书法字帖”等Word2010自带的模板创建文档,还可以单击Office网站提供的“名片”、“日历”等在线模板。例如单击“样本模板”选项。
第3步,打开样本模板列表页,单击合适的模板后,在“新建”面板右侧选中“文档”或“模板”单选框(本例选中“文档”选项),然后单击“创建”按钮。
第4步,打开使用选中的模板创建的文档,用户可以在该文档中进行编辑。
小提示:除了使用Word2010已安装的模板,用户还可以使用自己创建的模板和Office网站提供的模板。在下载Office网站提供的模板时,Word2010会进行正版验证,非正版的Word2010版本无法下载Office Online提供的模板。
文档时间{{time}}
展示图片{{@img}}

在这里插入图片描述

4. 测试使用的网络图片

在这里插入图片描述

5. 代码运行结果

生成的word文档:
在这里插入图片描述
生成的pdf:
在这里插入图片描述
生成的图片:
在这里插入图片描述
亲测格式正常,数据正常

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

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

相关文章

回归(Regression)

回归&#xff08;Regression&#xff09;在统计学和机器学习中是一种预测建模技术&#xff0c;它研究的是因变量&#xff08;目标变量&#xff09;和自变量&#xff08;特征&#xff09;之间的关系。回归分析的目的是建立一个数学模型&#xff0c;这个模型能够基于一个或多个自…

Leetcode—1256. 加密数字【中等】Plus(bitset、find_first_not_of、erase)

2024每日刷题&#xff08;120&#xff09; Leetcode—1256. 加密数字 实现代码 class Solution { public:string encode(int num) {string ans;num 1;while(num ! 0) {ans to_string(num & 1);num num >> 1;}if(ans.empty()) {return "";} else {stri…

coreldraw2024精简版绿色版安装包免费下载

CorelDRAW 2024是一款矢量图形设计软件&#xff0c;于2024年3月5日正式在全球范围内发布。这款软件在多个方面进行了更新和改进&#xff0c;为用户提供了更多高效、灵活和便捷的设计工具。 首先&#xff0c;CorelDRAW 2024新增了绘画笔刷功能&#xff0c;这些笔刷不仅模拟了传…

Ubuntu20.04 [Ros Noetic]版本——在catkin_make编译时出现报错的解决方案

今天在新的笔记本电脑上进行catkin_make的编译过程中遇到了报错&#xff0c;这个报错在之前也遇到过&#xff0c;但是&#xff0c;我却忘了怎么解决。很是头痛&#xff01; 经过多篇博客的查询&#xff0c;特此解决了这个编译报错的问题&#xff0c;于此特地记录&#xff01;&…

深入探索Android Service:多线程环境最佳实践与系统级操作

引言 Service作为Android平台的基石之一&#xff0c;其在多线程环境下的高级应用以及跨应用通信的能力&#xff0c;为开发者提供了构建高性能、高稳定性应用的可能。本文将深入探讨Service在多线程环境下的最佳实践&#xff0c;以及Service 与系统级操作、Service与系统资源管…

day17面向对象三大特征—封装

回顾 1.对象:一个拥有属性和方法的实例:实体 2类名 ;大骆驼峰 class 类名: 类代码 class People: 类属性 (类属性:所有的对象共有的属性) name = 一类人 def __init__(self, name, age, sex): self : 对象本身 self.name 拿到属性值 self…

SpringCloud和SpringBoot技术选型

Spring Cloud和Spring Boot在技术选型上各自具有独特的特点和优势&#xff0c;它们在不同的场景和需求下发挥着不同的作用。 Spring Boot是一个快速开发框架&#xff0c;它简化了传统MVC的XML配置&#xff0c;使得配置变得更加方便、简洁。通过采用“约定优于配置”的理念&…

【已解决】c++如何在MFC框架中按下某键触发触发事件

本博文源于昨天处理的一个事件&#xff0c;接收到回车键进行检测&#xff0c;同样的这个也可以接收其他键&#xff0c;比如A 键B键之类的。这里可以在mfc框架中使用这个函数 BOOL ****::PreTranslateMessage(MSG* pMsg);该函数会在程序运行时不停地被调用只需要你用if去拦截它…

[论文笔记]SEARCHING FOR ACTIVATION FUNCTIONS

引言 今天带来另一篇激活函数论文SEARCHING FOR ACTIVATION FUNCTIONS的笔记。 作者利用自动搜索技术来发现新的激活函数。通过结合详尽的搜索和基于强化学习的搜索&#xff0c;通过实验发现最佳的激活函数 f ( x ) x ⋅ sigmoid ( β x ) f(x) x \cdot \text{sigmoid}(βx…

Unity DOTS中的baking(五)prefabs

Unity DOTS中的baking&#xff08;五&#xff09;prefabs 在DOTS的baking过程中&#xff0c;prefabs会被烘焙成entity prefabs。entity prefabs也是一个entity&#xff0c;可以在运行时实例化&#xff0c;就像是prefab一样。我们可以使用EntityPrefabReference这个struct&#…

瓦片编辑器成功移植到小熊猫C++ 2.25.1版本,解决_findnext移植问题

移植之后出现绿色屏幕闪退 查了版本回滚直到不闪退&#xff0c;发现是在读取自定义文件上出问题 然后在找读取自定义文件函数&#xff0c;发现是读取图片部分出问题 然后就卡住了 调试半天&#xff0c;不是数据溢出&#xff0c;于是就看 函数_findnext,网上搜 ———_findn…

Java项目启动检测 Redis 是否启动,未启动则启动(macOS 版本)

文章目录 一、概述二、代码 一、概述 启动项目时&#xff0c;检测macos 上 Redis 是否启动&#xff0c;未启动&#xff0c;则启动。 二、代码 /*** 用途: 项目启动时检查 redis&#xff0c;未启动则启动&#xff08;开发环境&#xff09;** author: ADAM* create: 2024/04/2…

4.Docker本地镜像发布至阿里云仓库、私有仓库、DockerHub

文章目录 0、镜像的生成方法1、本地镜像发布到阿里云仓库2、本地镜像发布到私有仓库3、本地镜像发布到Docker Hub仓库 Docker仓库是集中存放镜像的地方&#xff0c;分为公共仓库和私有仓库。 注册服务器是存放仓库的具体服务器&#xff0c;一个注册服务器上可以有多个仓库&…

项目开发规范

Restful REST&#xff0c;表述性状态转换&#xff0c;他是一种软件架构风格 使用URL定位资源&#xff0c;HTTP动词描述操作 根据发出请求类型来区分操作 GET&#xff1a; 查询id为1的用户POST&#xff1a;新增用户PUT&#xff1a;修改用户DELETE&#xff1a;删除id为1的用户 …

springboot权限验证学习-上

创建maven项目 创建父工程 这类项目和原来项目的区别在于&#xff0c;打包方式是pom 由于pom项目一般都是用来做父项目的&#xff0c;所以该项目的src文件夹可以删除掉。 创建子工程 子工程pom.xml 父工程pom.xml 添加依赖 父工程导入依赖包 <!--导入springboot 父工程…

18.Nacos配置管理-微服务读取Nacos中的配置

需要解决的问题 1.实现配置更改热更新&#xff0c;而不是改动了配置文件还要去重启服务才能生效。 2.对多个微服务的配置文件统一集中管理。而不是需要对每个微服务逐一去修改配置文件&#xff0c;特别是公共通用的配置。 配置管理服务中的配置发生改变后&#xff0c;回去立…

病理组学+配对 mIHC 验证+转录组多组学

目录 病理DeepRisk网络模型构建 DPS和新辅助化疗 mIHC 验证 STAD转录组层面 病理DeepRisk网络模型构建 自有数据训练&#xff0c;TCGA数据进行验证&#xff0c;然后配对mIF验证&#xff0c;最后还在转录组层面分析。 该模型基于中山数据集&#xff08;n 1120&#xff09…

【AIGC调研系列】Sora级别的国产视频大模型-Vidu

Vidu能够达到Sora级别的标准。Vidu被多个来源认为是国内首个Sora级别的视频大模型[2][3][4]。它采用了团队原创的Diffusion与Transformer融合的架构U-ViT&#xff0c;能够生成长达16秒、分辨率高达1080P的高清视频内容[1][6]。此外&#xff0c;Vidu的一致性、运动幅度都达到了S…

美易官方:巴菲特股东大会召开在即,新浪财经中美投资人酒会5月4日举行

在五月的阳光下&#xff0c;全球投资者的目光都聚焦在了美国中部城市奥马哈。这里是“投资界春晚”——巴菲特股东大会的举办地&#xff0c;也是全球投资者共享投资智慧的圣地。今年的巴菲特股东大会更是备受瞩目&#xff0c;不仅有“股神”巴菲特的精彩演讲&#xff0c;还有新…

【Spring】IOC/DI中常用的注解@Lazy、@Scope与@Conditional

目录 1、Lazy 懒加载bean 1.1、与component配合使用 1.2、与Bean注解配合使用 2、Scope bean的作用域 2.1、不指定Scope 2.2、指定Scope为 prototype 3、Conditional 条件注解 1、Lazy 懒加载bean Lazy用于指定单例bean实例化的时机&#xff0c;在没有指定此注解时&…