文章目录

  • 前言
  • 一、制作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格式相关推荐

  1. 使用freemarker模板生成带图片的word--html格式

    文章目录 前言 一.制作freemarker模板 二.修改模板 三.后台代码 四.结果 总结 前言 用户需要预览word的功能,word里面带了很多图片,本文选择生成html格式的word来提供该功能 ...

  2. echart freemarker 模板_SpringBoot集成Freemarker模板生成Echarts图片(三)

    紧接着前面两篇,本篇采用Freemarker模板来生成Echarts图片. 一. 项目结构 二. Freemarker模板 (1)柱状图 { "title": { "te ...

  3. java生成docx_java利用Freemarker模板生成docx格式的word文档

    之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,生成的word占用的空间很大,几百页的word有将近100M了.所以,后面需求必须是生成的docx文档,结果导出后正常才 ...

  4. java利用Freemarker模板生成docx格式的word文档(全过程)

    参考汇总: wordexport: JAVA生成并导出Word文档技术论证 java利用Freemarker模板生成docx格式的word文档(全过程) - 旁光 - 博客园 # 参考资料 - 其他项 ...

  5. springboot结合Freemarker模板生成docx格式的word文档(附代码)

    首先参考的是这篇文章: java利用Freemarker模板生成docx格式的word文档(全过程) - 旁光 - 博客园参考:https://my.oschina.net/u/3737136/blo ...

  6. 利用 freemarker 模板生成 word 小结

    在企业级开发时,不可避免的会遇到生成 word 文档的需求,有两种常用的方案,1.使用 Apache POI 在后台通过代码生成 word 文档:2.使用模板生成 word 文档.第二种方法比较简单, ...

  7. java利用Freemarker模板生成格式友好的doc或者docx文档

    之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,不支持生成docx格式的文档.所以,这里补充一篇,生成docx或doc格式的文档以具体的docx模板或者doc模板为主. ...

  8. java生成word文档 图片_java生成带有图片的word的文档-Go语言中文社区

    生成带有图片的word的文档 @RequestMapping(params ="getWordByDate",produces = "text/html;charset= ...

  9. freemarker 模板生成pdf文件并下载

    利用freemarker 模板生成pdf文件,通过浏览器直接下载或生成文件到指定目录 1.pom.xml文件 <!--引入Freemarker的依赖--> <dependency&g ...

最新文章

  1. Service Manager 的系统要求
  2. PostgreSQL · 实现分析 · PostgreSQL 10.0 并行查询和外部表的结合
  3. Linux查看文件夹大小的相关命令
  4. .NET自动化测试工具链:Selenium+NUnit+ExtentReport
  5. 基本的输入输出函数介绍
  6. SQL点滴19—T-SQL中的透视和逆透视
  7. Java 128陷阱+自动装箱拆箱
  8. 开发springboot项目,遇到的一些问题总结
  9. linux服务器数据备份到本地硬盘_等保数据备份和恢复关键点,这些你该知道!...
  10. 数据结构 /ord ;集合;dict()
  11. echarts实现2d柱状_记录echarts比较难实现的图1(一个背景上呈现三个柱状图)
  12. php smarty安装,Smarty安装
  13. 求助:Flash Builder 4.7早上开机后提示“未能创建视图: 插件“com.adobe.flexbuilder.as.editor”无法实例化
  14. MySql Server 5.5安装教程
  15. Ubuntu 20.04 快速搭建Vue开发环境
  16. Stream之Collectors(toList()
  17. c语言合并jpg成pdf,JPG在线转换成PDF文件的简单方法
  18. H5一键复制 兼容iOS
  19. Python+pyqt+dicom+vtk 使用pyinstaller打包软件时正常,运行报错vtkmodules.all、pydicom.encoders.pylibjpeg等错误
  20. C# 调用Everything查找文件

热门文章

  1. cmake中add_definitions的用法
  2. linux mjpg-streamer安装
  3. autoformr7安装许可证_AutoForm R6 安装方法
  4. 阿里遭背刺,1亿美元收购的开源项目,核心团队出走,转头又卖了1个亿
  5. 《学习的方法》读书笔记
  6. C语言程序设计第四版 苏小红 习题答案 3.5
  7. C6000系列DSP优化总结
  8. 我们专访了神龙云服务器产品负责人,看懂阿里云发布的“神龙”到底“神”在哪里
  9. 猜数字小游戏(java代码编写)
  10. kotlin语言中的out和in