Java——使用Aspose实现docx模板填充与导出word和pdf
文章目录
- 前言
- 项目版本
- 模板准备
- 测试代码块
-
- 依赖引入
- 各种文本填充
- 几个中间类定义
-
- 数据表对象定义
- 中间存储类定义
- 实际填充处理方法工具类
- 导出效果
-
- word
前言
本文主要说明使用Aspose
将带有书签
作为占位符的模板,进行数据的替换,同时将替换后的文本导出word、pdf文本类型。
项目版本
- maven 3.6.3
- jdk 17
- Aspose 16.8.0
模板准备
创建一个xxx.docx
的模板文件,在其中增加文本输入框
、表格
等。并在其中制定对应的标签。
大致模板组成如下所示:
导出模板文件,并放置于项目的src/main/resources
目录下,如下所示:
测试代码块
依赖引入
Aspose
没有找到ali私服
的pom
文件,目前采取项目中新建lib,在项目的pom.xml
中进行引入。
<dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>15.8.0</version><scope>system</scope><systemPath>${project.basedir}/lib/aspose-words-16.8.0.jar</systemPath>
</dependency><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.4</version>
</dependency><!-- Md5 格式文件转换 依赖 -->
<dependency><groupId>org.commonmark</groupId><artifactId>commonmark</artifactId><version>0.21.0</version> <!-- 最新版本可更新 -->
</dependency>
<!-- 扩展支持(如表格、任务列表等非标准 MD 语法) -->
<dependency><groupId>org.commonmark</groupId><artifactId>commonmark-ext-gfm-tables</artifactId><version>0.21.0</version>
</dependency><!-- 工具类 主要使用其中base64转换,避免linux的乱字符 -->
<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId>
</dependency>
各种文本填充
一般情况下,富文本
类型的文件有两种,html
与md5
。但是在进行带样式内容填充渲染,仅支持html
格式的内容填充。
普通图片可以直接进行填充进入word文档中,但是针对富文本
填充至标签空间中,图片样式仅支持 Base64
!
import com.aspose.words.Document;
import com.aspose.words.DocumentBuilder;
import com.aspose.words.License;
import enty.Users;
import utils.AsposeUtils;
import utils.WordToPdfUtil;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.*;public class AsposeTest {/*** 书签占用* @param args* @throws Exception*/public static void main(String[] args) throws Exception {// 加载证书 取数水印try {InputStream is = AsposeTest.class.getClassLoader().getResourceAsStream("licenses/license.xml");License asposeLic = new License();asposeLic.setLicense(is);} catch (Exception e) {throw new RuntimeException(e);}// 加载 Word 模板InputStream inWord = WordToPdfUtil.class.getClassLoader().getResourceAsStream("temp/11.docx");// 加载模板Document doc = new Document(inWord);// 文件构造器DocumentBuilder builder = new DocumentBuilder(doc);// 富文本(图片必须 base64)String fwb = "<p style=\"text-align: center;\"> " +"唐多令·芦叶满汀洲</p><p style=\"text-align: center;\"> " +"南宋·刘过 </p><p style=\"text-align: center;\"> " +"安远楼小集,侑觞歌板之姬黄其姓者,乞词于龙洲道人,为赋此《唐多令》。" +"同柳阜之、刘去非、石民瞻、周嘉仲、陈孟参、孟容。时八月五日也。</p>" +"<p style=\"text-align: center;\"> 芦叶满汀洲,寒沙带浅流。" +"二十年重过南楼。柳下系船犹未稳,能几日,又中秋。</p>" +"<p style=\"text-align: center;\"> 黄鹤断矶头,故人今在否?旧江山浑是新愁。<br/>" +"<a href=\"https://hanyu.baidu.com/hanyu-page/poem/detail?sid=d75b1cc88a094d5497bf0d3d5f6ac2ed&from=aladdin&pid=d75b1cc88a094d5497bf0d3d5f6ac2ed&smp_names=termBrand2,poem1&user_info%5Bun%5D=%E4%B8%BF%E7%A5%9E%E5%9F%9F%E7%81%AC%E6%88%98%E7%8B%BC&user_info%5Buid%5D=849607069&userid=849607069\" target=\"_blank\">欲买桂花同载酒,终不似,少年游</a>。" +//"<p>包含一张图片:<img src='src/main/resources/img/fish.png' /></p>" +"</p><p style=\"text-align: center;\">" +"<img src=\"data:image/png;base64,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\" alt=\"image 10@2x.png\" data-href=\"\" style=\"\"></p>";AsposeUtils.fillRichText(doc,builder,"Fwb1",fwb,true);// md5 格式的富文本填充String mdContent = "## 标题1\n" +"### 标题2\n" +"这只是一个`markdown`格式的**文本**\n" +"\n" +"列表\n" +"- 1、xxxx\n" +"- 2、MMMM\n" +"\n" +"[这只是一个链接](http://www.baidu.com)\n" +"\n" +"[](undefined \"这只是一张图\")";// md5 格式的图片也不支持AsposeUtils.fillRichText(doc,builder,"Fwb_md5",mdContent,false);// 数据表(域)List<Object> usersList = Arrays.asList(new Users("xj1", 20, "男"), new Users("xj2", 18, "女"));AsposeUtils.fillListData(doc, usersList,"workerList");// 书签的形式// 转成map格式List<Map<String,String>> userMapLists = AsposeUtils.list2mapList(usersList);AsposeUtils.fillTable2(doc,builder,"bookmark_table",userMapLists);// 超链接AsposeUtils.fillHyperlink(doc, builder, "bookmark_hyperlink", "Aspose官网", "https://products.aspose.com/words/");// 图片InputStream inImg = WordToPdfUtil.class.getClassLoader().getResourceAsStream("img/fish.png");BufferedImage image = ImageIO.read(inImg);// 转换大小与格式BufferedImage bufferedImage = AsposeUtils.resizeBufferedImage(image, 50, 50, true);AsposeUtils.fillImage2(doc,builder, "logImg", bufferedImage);String out_file_base_path = "doc/"+ UUID.randomUUID();// worddoc.save(