使用freemarker模板生成带图片的word--xml格式
文章目录
- 前言
- 一、制作freemarker模板
- 1、 准备模板
- 2、修改模板
- 二、后台代码
- 1.引入freemarker依赖
- 2. freemarker工具类方法
- 3. 测试方法
- 三、测试结果
- 总结
前言
以xml的格式生成word,可以将图片的二进制数据保存在word中,无需考虑图片的存放位置。
一、制作freemarker模板
1、 准备模板
首先,新建一个docx,然后往word里粘贴一个图片,再将word另存为xml文件。
新建一个freemarker文件,如 word.ftl,将xml内容拷贝到word.ftl中。
2、修改模板
1、找到图片所在的Relationship ,修改成如下格式
<#list pictList as pict><Relationship Id="rId${pict_index+10}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"Target="media/image${pict_index+10}.png"/>
</#list>
2、找到 <w:body>,写入图片的title和引用的Relationship
(1)title在
<w:t>${pict.title}</w:t>
(2)Relationship 在
<a:blip r:embed="rId${pict_index+10}"/>
(3)完整的body如下
<w:body><#list pictList as pict ><w:p><w:r><w:t>${pict.title}</w:t></w:r><w:r><w:rPr><w:rFonts w:hint="eastAsia"/></w:rPr><w:t>:</w:t></w:r></w:p><w:p><w:r><w:drawing><wp:inline distT="0" distB="0" distL="0" distR="0"><wp:extent cx="5274310" cy="2743835"/><wp:effectExtent l="0" t="0" r="2540" b="0"/><wp:docPr id="${pict_index+10}" name="图片 ${pict_index+10}"/><wp:cNvGraphicFramePr><a:graphicFrameLocksxmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"noChangeAspect="1"/></wp:cNvGraphicFramePr><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicDatauri="http://schemas.openxmlformats.org/drawingml/2006/picture"><pic:picxmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture"><pic:nvPicPr><pic:cNvPr id="${pict_index+10}" name="图片 ${pict_index+10}"/><pic:cNvPicPr><a:picLocks noChangeAspect="1"/></pic:cNvPicPr></pic:nvPicPr><pic:blipFill><a:blip r:embed="rId${pict_index+10}"/><a:stretch><a:fillRect/></a:stretch></pic:blipFill><pic:spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="5274310" cy="2743835"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r></w:p><w:p/></#list>
3、找到 pkg:binaryData标签
将原来的二进制数据删除,并修改为如下格式
<#list pictList as pict ><pkg:part pkg:name="/word/media/image${pict_index+10}.png" pkg:contentType="image/png"><pkg:binaryData>${pict.data}</pkg:binaryData></pkg:part></#list>
二、后台代码
1.引入freemarker依赖
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.28</version>
</dependency>
2. freemarker工具类方法
public static File crateWord(Map<String, Object> data, String templateName, String targetFile) throws IOException, TemplateException {Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);String path = templateName.substring(0,templateName.lastIndexOf("/"));String filename = templateName.substring(templateName.lastIndexOf("/") + 1);cfg.setClassForTemplateLoading(TemplateUtils.class, path);cfg.setEncoding(Locale.getDefault(), "UTF-8");cfg.setObjectWrapper(new DefaultObjectWrapper(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS));Writer out = null;File outFile = new File(targetFile);try {Template template = cfg.getTemplate(filename, "UTF-8");out = new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8");template.process(data, out);out.flush();} finally {try {if (out != null) {out.close();}} catch (IOException e) {e.printStackTrace();}}return outFile;}
3. 测试方法
public static void main(String[] args) throws Exception {Map data = getData();String templateName = "/templates/ftl/word.ftl";String targetFile = "C:\\Users\\x\\Desktop\\word\\word.docx";TemplateUtils.crateWord(data,templateName,targetFile);}
createWord方法
private static Map getData() throws IOException {Map data = new HashMap();List<Map> pictList = new ArrayList<>();Map pict1 = new HashMap();pict1.put("title", "图片1");pict1.put("data", TemplateUtils.getBinaryData(bathPath + "test2.jpg"));Map pict2 = new HashMap();pict2.put("title", "图片2");pict2.put("data", TemplateUtils.getBinaryData(bathPath + "test3.jpg"));pictList.add(pict1);pictList.add(pict2);data.put("pictList", pictList);return data;}
getBinaryData 方法
public static String getBinaryData(String src) throws IOException {File file = new File(src);InputStream in = new FileInputStream(file);byte[] data = new byte[in.available()];try {in.read(data);} finally {if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}}Base64.Encoder encoder = Base64.getEncoder();return encoder.encodeToString(data);}
三、测试结果
总结
本文介绍了以xml的方式往word里插入图片。
使用freemarker模板生成带图片的word--xml格式相关推荐
- 使用freemarker模板生成带图片的word--html格式
文章目录 前言 一.制作freemarker模板 二.修改模板 三.后台代码 四.结果 总结 前言 用户需要预览word的功能,word里面带了很多图片,本文选择生成html格式的word来提供该功能 ...
- echart freemarker 模板_SpringBoot集成Freemarker模板生成Echarts图片(三)
紧接着前面两篇,本篇采用Freemarker模板来生成Echarts图片. 一. 项目结构 二. Freemarker模板 (1)柱状图 { "title": { "te ...
- java生成docx_java利用Freemarker模板生成docx格式的word文档
之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,生成的word占用的空间很大,几百页的word有将近100M了.所以,后面需求必须是生成的docx文档,结果导出后正常才 ...
- java利用Freemarker模板生成docx格式的word文档(全过程)
参考汇总: wordexport: JAVA生成并导出Word文档技术论证 java利用Freemarker模板生成docx格式的word文档(全过程) - 旁光 - 博客园 # 参考资料 - 其他项 ...
- springboot结合Freemarker模板生成docx格式的word文档(附代码)
首先参考的是这篇文章: java利用Freemarker模板生成docx格式的word文档(全过程) - 旁光 - 博客园参考:https://my.oschina.net/u/3737136/blo ...
- 利用 freemarker 模板生成 word 小结
在企业级开发时,不可避免的会遇到生成 word 文档的需求,有两种常用的方案,1.使用 Apache POI 在后台通过代码生成 word 文档:2.使用模板生成 word 文档.第二种方法比较简单, ...
- java利用Freemarker模板生成格式友好的doc或者docx文档
之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,不支持生成docx格式的文档.所以,这里补充一篇,生成docx或doc格式的文档以具体的docx模板或者doc模板为主. ...
- java生成word文档 图片_java生成带有图片的word的文档-Go语言中文社区
生成带有图片的word的文档 @RequestMapping(params ="getWordByDate",produces = "text/html;charset= ...
- freemarker 模板生成pdf文件并下载
利用freemarker 模板生成pdf文件,通过浏览器直接下载或生成文件到指定目录 1.pom.xml文件 <!--引入Freemarker的依赖--> <dependency&g ...
最新文章
- Service Manager 的系统要求
- PostgreSQL · 实现分析 · PostgreSQL 10.0 并行查询和外部表的结合
- Linux查看文件夹大小的相关命令
- .NET自动化测试工具链:Selenium+NUnit+ExtentReport
- 基本的输入输出函数介绍
- SQL点滴19—T-SQL中的透视和逆透视
- Java 128陷阱+自动装箱拆箱
- 开发springboot项目,遇到的一些问题总结
- linux服务器数据备份到本地硬盘_等保数据备份和恢复关键点,这些你该知道!...
- 数据结构 /ord ;集合;dict()
- echarts实现2d柱状_记录echarts比较难实现的图1(一个背景上呈现三个柱状图)
- php smarty安装,Smarty安装
- 求助:Flash Builder 4.7早上开机后提示“未能创建视图: 插件“com.adobe.flexbuilder.as.editor”无法实例化
- MySql Server 5.5安装教程
- Ubuntu 20.04 快速搭建Vue开发环境
- Stream之Collectors(toList()
- c语言合并jpg成pdf,JPG在线转换成PDF文件的简单方法
- H5一键复制 兼容iOS
- Python+pyqt+dicom+vtk 使用pyinstaller打包软件时正常,运行报错vtkmodules.all、pydicom.encoders.pylibjpeg等错误
- C# 调用Everything查找文件