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

news2024/11/28 2:41:23

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));
        // 转成 pdf
        OutputStream 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.coloradmin.cn/o/1631648.html

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

相关文章

OpenHarmony实战开发-动画效果、如何实现阴影效果

阴影接口shadow可以为当前组件添加阴影效果&#xff0c;该接口支持两种类型参数&#xff0c;开发者可配置ShadowOptions自定义阴影效果。ShadowOptions模式下&#xff0c;当radius 0 或者 color 的透明度为0时&#xff0c;无阴影效果。 Entry Component struct ShadowOptionD…

MybatisPlus 页数page过大数据溢出问题

最近在修改公司代码时前端报了个奇怪的bug&#xff0c;即某个分页接口明明数据量只有42条&#xff0c;但是使用page 500 size 10 的配置时仍然可以查出数据 如下图所示 可见 total 属性只有 42条数据&#xff0c;页数都到500了但是很夸张的还是查出来10条数据 查询后端…

从阿里云崩溃看IT系统非功能能力验证

昨天下午6点左右学员群里有人说阿里云又出问题了&#xff0c;并且还挺长时间没有恢复了。 我也登录了一下&#xff0c;结果登录直接不停地302。如下所示&#xff1a; 做为阿里云重要的基础设施&#xff0c;这一故障影响了。如官方通告的处理时间线&#xff1a; 17:44起&#…

【笔试训练】day12

1.牛牛冲砖五 思路&#xff1a; 看懂样例即可。 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std;int main() {int t;cin >> t;string str;while (t--) {int n, k;cin >> n >> k >> str;int an…

鸿蒙OpenHarmony【小型系统 烧录】(基于Hi3516开发板)

烧录 针对Hi3516DV300开发板&#xff0c;除了DevEco Device Tool&#xff08;操作方法请参考烧录)&#xff09;外&#xff0c;还可以使用HiTool进行烧录。 前提条件 开发板相关源码已编译完成&#xff0c;已形成烧录文件。客户端&#xff08;操作平台&#xff0c;例如Window…

微软开源了 MS-DOS 4.00

DOS的历史源远流长&#xff0c;很多现在的年轻人不知道DOS了。其实早期的windows可以看做是基于DOS的窗口界面的模拟器&#xff0c;系统的本质其实是DOS。后来DOS的漏洞还是太多了&#xff0c;微软重新写了windows的底层内核。DOS只是一个辅助终端的形式予以保留了。 微软是在…

FTP 文件传输协议

FTP 文件传输协议 作用 用来传输文件的 FTP协议采用的是TCP作为传输协议&#xff0c; 21号端口用来传输FTP控制命令的&#xff0c; 20号端口用来传输文件数据的 FTP传输模式&#xff1a; 主动模式&#xff1a; FTP服务端接收下载控制命令后&#xff0c;会主动从tcp/20号端口…

pyaibote--安卓自动化环境配置与基础的使用方法

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 pyaibote介绍 pyaibote是一个全新&#xff0c;强大的办公自动化库。 支持找图&#xff0c;识别像素等操作。 比appium快十倍。 文章介绍 有大佬给我提到这个库后&#xff0c;我来查看。然后发现这个库太新了&am…

自然语言处理 (NLP) 中的迁移学习

--懂王 在大数据高速发展的时代&#xff0c;AI的发展日新月异&#xff0c;充满挑战的迎接未来。 自然语言处理 (NLP) 中的迁移学习: 迁移学习在 NLP 中越来越受欢迎&#xff0c;特别是在数据稀缺的情况下。如何有效地利用预训练的语言模型&#xff0c;并将其迁移到新的任务和领…

windows驱动开发-中断(一)

中断是windows中最难的一部分&#xff0c;这是因为中断本身属于操作系统的一部分&#xff0c;理解了中断和内存&#xff0c;对整个系统也就了解了。 中断部分会先从中断优先级、中断处理、中断服务例程入手&#xff0c;大概讲述一下中断的概念&#xff1b;接着从中断的一般实现…

如何买到“30元以下”的免备案服务器?

对于预算有限的个人和小型企业来说&#xff0c;30 元以下免备案服务器的价格非常亲民。用户可以以极低的成本获得所需的服务器资源&#xff0c;这对创业者、个人开发者、学生和站长来说简直不要太划算&#xff0c;毕竟配置可以升级真不够后面再付费升级也行。 何为“免备案”&…

ROS1快速入门学习笔记 - 07话题消息的定义与使用

目录 一、话题模型 二、自定义话题消息 1. 在功能包下创建msg目录用于存储话题文件 2. 在package.xml文件中添加功能包依赖&#xff1b; 3. 在CMakeLists.txt增加编译选项&#xff1b; 4. 完成编译 5. 配置CMakeLists.txt中的编译规则&#xff08;增加发布者和订阅者&am…

Meta Llama 3 性能提升与推理服务部署

利用 NVIDIA TensorRT-LLM 和 NVIDIA Triton 推理服务器提升 Meta Llama 3 性能 我们很高兴地宣布 NVIDIA TensorRT-LLM 支持 Meta Llama 3 系列模型&#xff0c;从而加速和优化您的 LLM 推理性能。 您可以通过浏览器用户界面立即试用 Llama 3 8B 和 Llama 3 70B&#xff08;该…

卫浴品牌商家做展示预约小程序的作用是什么

卫浴品牌类别多、普通/智能、场景化等&#xff0c;无论企业还是经销商市场门店都比较饱满&#xff0c;虽然市场需求度高&#xff0c;但同样需要商家不断拓宽销售渠道和挖掘客户价值&#xff0c;破圈增长。 线上多平台发展尤为重要&#xff0c;而小程序作为连接点&#xff0c;对…

深度学习模型的优化和调优de了解

深度学习模型的优化和调优&#xff1a;随着深度学习应用的广泛&#xff0c;优化和调优神经网络模型成为了一个重要的问题。这包括选择合适的网络架构、调整超参数、应对过拟合等。 深度学习模型的优化和调优是指在训练神经网络模型时&#xff0c;通过一系列技术和方法来提高模型…

无缝迁移:从阿里云WAF到AWS的成功转变之路

在当今数字化浪潮中&#xff0c;网络安全已经成为企业发展的重要组成部分。阿里云WAF&#xff08;Web 应用防火墙&#xff09;作为一种重要的网络安全解决方案&#xff0c;帮助企业保护其 Web 应用免受各种网络攻击。 然而&#xff0c;随着企业业务的扩展和需求的变化&#xf…

SA模拟退火算法优化高斯回归回归预测matlab代码

SA高斯回归回归预测matlab代码 模拟退火算法&#xff08;Simulated Annealing&#xff0c;简称SA&#xff09;是一种用于解决优化问题的启发式算法。它受到固体退火过程中温度逐渐降低的启发&#xff0c;通过随机性的搜索和接受劣解的策略&#xff0c;来在复杂的搜索空间中寻找…

JAVA读取从WPS在Excel中嵌入的图片资源

读取从WPS在Excel中嵌入的图片资源 引言 许多数据文件中可能包含嵌入式图片&#xff0c;这些图片对于数据分析和可视化非常重要。然而&#xff0c;从 WPS 在 Excel 中读取这些图片可能会有一些技术挑战。在本文中&#xff0c;我将展示如何从 WPS Excel 文件中读取嵌入的图片&am…

618科技嘉年华!五款极致科技产品,开启智能生活新篇章!

准备好迎接一年一度的618了吗&#xff1f;这不仅仅是一场购物的狂欢&#xff0c;更是一次科技的盛宴&#xff0c;一次智能生活的全新启航。今年&#xff0c;我们将带来五款令人瞩目的极致科技产品&#xff0c;它们将彻底颠覆你对智能生活的认知。从娱乐到工作&#xff0c;这些产…

逆向案例三十——webpack登录某游戏

网址&#xff1a;aHR0cHM6Ly93d3cuZ205OS5jb20v 步骤&#xff1a; 进行抓包分析&#xff0c;找到登录接口&#xff0c;发现密码有加密 跟栈分析&#xff0c;从第三个栈进入&#xff0c;打上断点&#xff0c;再次点击登录 明显找到password,它由o赋值&#xff0c;o由a.encode(…