先看效果:

填充前:

填充后效果:


第一步: 引入Maven坐标:

        <!-- hutool工具类 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.6.3</version></dependency><!--word模板数据解析--><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.9.0-beta</version></dependency><!-- word/pdf操作 --><dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>14.7.0</version><scope>system</scope><systemPath>${pom.basedir}/lib/aspose-words-15.8.0-jdk16.jar</systemPath></dependency>

第二步: 工具类: 

import cn.hutool.system.OsInfo;
import cn.hutool.system.SystemUtil;
import com.aspose.words.Document;
import com.aspose.words.FontSettings;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.exception.RenderException;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import lombok.extern.slf4j.Slf4j;import java.io.*;
import java.util.Map;/*** @author LSL* @version 1.0* @date 2022/6/22*/
@Slf4j
public class WordUtil {/*** 填充word模板,并且转成pdf文件后返回:* @param datas: 填充数据* @param fileStream: 文件模板流 -- 可从OSS/FastDFS上获取流,直接传入;* @return* @throws IOException*/public static byte[] fillWordToPDF(Map<String,Object> datas,InputStream fileStream) throws IOException {try {//先填充word:byte[] bytes = fillWord(datas, fileStream);//在word转pdf:return wordToPDF(new ByteArrayInputStream(bytes));} catch (IOException ex){log.error("系统异常::{}",ex);throw ex;}}/*** 填充word模板,获取填充后的word文件流:* @param datas: 填充数据* @param fileStream: 文件模板流 -- 可从OSS/FastDFS上获取流,直接传入;* @return* @throws IOException*/public static byte[] fillWord(Map<String,Object> datas, InputStream fileStream) throws IOException {XWPFTemplate template = null;ByteArrayOutputStream wordOut = new ByteArrayOutputStream(1024);try {//设置占位符:Configure config = Configure.builder().buildGramer("${", "}") //设置模板中的占位符${}, 默认是{{}}.setValidErrorHandler(new Configure.AbortHandler()) //若模板中占位符与填充属性不对应,则报错;.bind("item", new HackLoopTableRenderPolicy()) //设置模板中表格的参数属性.build();//填充文本域:template = XWPFTemplate.compile(fileStream, config).render(datas);template.write(wordOut);}catch (RenderException ex){log.error("模板填充失败,请保证模板文本域与参数保持一致。错误信息::{}",ex);throw ex;} catch (IOException ex){log.error("系统异常::{}",ex);throw ex;}finally {try {if (template != null){template.close();}} catch (IOException ex) {log.error("关闭文件流资源异常::{}",ex);}}return wordOut.toByteArray();}/*** word转pdf* @param wordInStream: word文件输入流;*/public static byte[] wordToPDF(InputStream wordInStream) {ByteArrayOutputStream byteOut = new ByteArrayOutputStream(1024);try {InputStream licenseIn = WordUtil.class.getClassLoader().getResourceAsStream("license.xml");License aposeLic = new License();aposeLic.setLicense(licenseIn);//因linux环境没有语言包,当项目部署到linux环境后,转成的pdf中的中文是类似乱码的,所以需要去加载此目录下的语言包;OsInfo osInfo = SystemUtil.getOsInfo();if(osInfo.isLinux()){//====================================== 注意 ============================================//注意: 需要把项目中resource/fonts目录下的语言包全部放到linux中的此目录下,否则linux环境中处理是乱码;//以下是我自己定义的目录,你可随意更改为你linux上的目录;FontSettings.setFontsFolder("/usr/share/fonts/chinese", true);//=======================================================================================}//Address是将要被转化的word文档Document doc = new Document(wordInStream);//全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,doc.save(byteOut, SaveFormat.PDF);} catch (Exception e) {log.error("word转pdf异常::{}",e);throw new RuntimeException("word转pdf异常");}return byteOut.toByteArray();}/*** word转pdf* @param wordInStream: word文件输入流;* @param pdfOutStream: pdf文件输出流;*/public static void wordToPDF(InputStream wordInStream, OutputStream pdfOutStream) {try {InputStream licenseIn = WordUtil.class.getClassLoader().getResourceAsStream("license.xml");License aposeLic = new License();aposeLic.setLicense(licenseIn);//因linux环境没有语言包,当项目部署到linux环境后,转成的pdf中的中文是类似乱码的,所以需要去加载此目录下的语言包;OsInfo osInfo = SystemUtil.getOsInfo();if(osInfo.isLinux()){//====================================== 注意 ============================================//注意: 需要把项目中resource/fonts目录下的语言包全部放到linux中的此目录下,否则linux环境中处理是乱码;//以下是我自己定义的目录,你可随意更改为你linux上的目录;FontSettings.setFontsFolder("/usr/share/fonts/chinese", true);//=======================================================================================}//Address是将要被转化的word文档Document doc = new Document(wordInStream);//全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,doc.save(pdfOutStream, SaveFormat.PDF);} catch (Exception e) {log.error("word转pdf异常::{}",e);throw new RuntimeException("word转pdf异常");}}
}

 注: license.xml文件内容如下

<?xml version="1.0" encoding="UTF-8" ?>
<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>

第三步: 测试

1、word模板文件: 请按照第一张图片自行制作;

2、测试代码:填充成功后直接转成pdf文件;

    public static void main(String[] args) throws IOException {//数据Map datas = new HashMap<String,Object>();datas.put("dept", "采购部");datas.put("name", "张三");LocalDate date = LocalDate.now();datas.put("year", date.getYear());datas.put("month", date.getMonthValue());datas.put("day", date.getDayOfMonth());//表格(多条数据格式):List itemList = new ArrayList<>();Map itemMap = new HashMap();itemMap.put("goods", "笔记本电脑");itemMap.put("num", "2");itemMap.put("cost", "10000");itemMap.put("remark", "按需采购");itemList.add(itemMap);itemMap = new HashMap();itemMap.put("goods", "台式电脑");itemMap.put("num", "1");itemMap.put("cost", "8000");itemMap.put("remark", "按需采购");itemList.add(itemMap);datas.put("item",itemList);datas.put("total","10000");//需要填充到word中的图片数据ClassLoader classLoader = WordUtil.class.getClassLoader();InputStream imageStream = classLoader.getResourceAsStream("template/image.png");BufferedImage bi = ImageIO.read(imageStream);int width = bi.getWidth();int height = bi.getHeight();datas.put("image", new PictureRenderData(width, height, PictureType.PNG, imageStream));//模板文件流InputStream tempStream = classLoader.getResourceAsStream("template/测试模板文件.docx");//填充word:byte[] bytes = WordUtil.fillWord(datas, tempStream);//word转pdf:File pdfFile = new File("生成的PDF文件" + System.currentTimeMillis() + ".pdf");WordUtil.wordToPDF(new ByteArrayInputStream(bytes),new FileOutputStream(pdfFile));}

注意:

1、word转pdf的jar包,在maven中心仓库中不存在,下载不了。在此我提供了jar包:

百度网盘: 百度网盘 请输入提取码

提取码: qk0x

Maven项目手动引入Jar包的编译、打包方式请看此篇文章: https://mp.csdn.net/mp_blog/creation/editor/125435777

 2、word转pdf时,Linux会出现中文乱码问题(window不存在);解决办法:Linux环境aspose插件word转pdf中文乱码解决方案_赵广陆的博客-CSDN博客_aspose中文乱码

Java - 填充Word文本域、Word转PDF操作相关推荐

  1. java中获取文本域内容_怎样读文件内容到文本域中(java SWT)

    //写了段简单的代码提供你参考importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importj ...

  2. Java 导出富文本到Word(包含图片)

    导入依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base< ...

  3. java 怎样设置文本域的字体颜色_java的JTextArea中怎么改变字体颜色

    展开全部 java swing 中JTEXTAREA不能改变字体颜色,它是纯文本组件,可以使用JTEXTPANE,通过操作DOCUMENT文档来控制JTEXTPANE显示的内容,下面的代码在一个323 ...

  4. JAVA 使用Itext模板生成pdf,解决图片插入,文本域超出字体缩放,半自动换行

    1.前言 前一段时间遇到一个制作Pdf的业务,自己下来摸索了一下,基本上解决.将其中遇到的几个问题及解决方法做以记录,仅供大家参考. 首先在这里对于刚接触该类型业务的同学说明下,ItexPdf支持使用 ...

  5. java 填充pdf_Java如何创建和填充PDF表单域(代码示例)

    本篇文章给大家带来的内容是关于Java如何创建和填充PDF表单域(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 表单域,可以按用途分为多种不同的类型,常见的有文本框.多行 ...

  6. java填充word文档_如何使Word文档可填充但不可编辑

    java填充word文档 If contracts are part of your daily workflow, you know how frustrating it is when peopl ...

  7. java 富文本 word_Java导出富文本到word

    源码地址: 背景 最近用java开发一个中车项目管理系统,里面有一个维修单word导出功能. 可用方案 在网上查找资料,总结出两种比较可行的方案. (1) 制作word模板,导出成mht文件(单页面网 ...

  8. java 填充pdf_Java创建和填充PDF表单域方法

    表单域,可以按用途分为多种不同的类型,常见的有文本框.多行文本框.密码框.隐藏域.复选框.单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据.下面的示例中,将分享通过Java编程在PDF中添加 ...

  9. Springboot —— 根据docx填充生成word文件,并导出pdf

    文章目录 前言 将docx模板填充数据生成doc文件 1.依赖引入 2.doc文件转换docx,并标注别名 3.编写java代码实现数据填充 docx文件填充数据导出pdf(web) 1.依赖引入 2 ...

  10. Java web/springboot上传word/doc/docx文档(含图片)与HTML富文本导入/导出互相转换解析!附项目源码

    测试效果 先看下效果 文档内容如下: 上传 上传docx文档 查看解析内容 <html><head><style>p{margin-top:0pt;margin-b ...

最新文章

  1. mq日志怎么看_RocketMQ的消息是怎么丢失的
  2. netbeans项目缺少服务器,Netbeans,添加Glassfish服务器“不存在”
  3. 函数式编程基础_在收件箱中免费学习函数式编程的基础
  4. PyQt5学习笔记03----Qt Designer生成源码
  5. 有关 !DOCTYPE HTML
  6. ubuntu16.04安装pycharm,并设置快捷启动方式
  7. java从入门到精髓 - IO输入输出
  8. Raki的读paper小记:CLASSIC: Continual and Contrastive Learning of Aspect Sentiment Classification Tasks
  9. python机器视觉车牌识别_车牌识别系统中的机器视觉技术
  10. 华为云服务器建站教程
  11. 论文解读:ARNOR: Attention Regularization based Noise Reduction for Distant Supervision Relation Class...
  12. 使用Flurry来统计和分析用户行为
  13. vue中用canvas 画一个六边形 类似蜂窝形的功能导航主菜单
  14. Node.js 网站内容抓取及Mysql存取Demo
  15. 短信验证码内容组成及设计注意事项
  16. 扫地机器人杂牌的怎么样_扫地机器人贵的和便宜的之间有何区别?
  17. 计算机教师评职称自我鉴定,教师评职称的自我鉴定范文
  18. 清华大学出版社与SAP签署战略合作协议
  19. HiKey970 环境搭建和烧录
  20. C语言中宽字符和多字节字符

热门文章

  1. linux远程ssh的端口映射,SSH端口映射
  2. 黑马程序员2022年最新软件测试学习路线
  3. 【Linux下载安装jdk8】
  4. c 转易语言源码,易语言代码转HTML 测试(源码方式)
  5. 天翼校园网连接不上服务器无响应,天翼校园网dns解析出错怎么办
  6. 指标公式c语言源码下载,通达信超级厉害指标公式源码附图-通达信公式-公式指标网...
  7. java 发送邮件多个人,java 发送邮件(支持多附件,抄送人等功能)
  8. 【经验】win11上安装visio
  9. 3种云桌面(VDI、IDV、VOI)技术解决方案简介
  10. Jupyter Notebook使用