使用freemarker生成word、html时,在图片显示这儿碰了个大钉子,最后总算弄出来了,这里总结一下。

1、生成word

a、使用freemarker生成word文档图片显示需要特殊处理,若是按照常理(使用占位符的形式)替换完成之后显示图片的区域只会出现一堆内容(即你给它赋值的内容)而不是一张图片。

b、如何处理:直接从某处复制一张图片放到word中需要显示的区域,然后另存为xml。打开xml文件可以发现这张图片是以base64编码存在的,且这些编码放在<w:binData>标签之中。将这些base64编码使用占位符代替然后进行常规处理就能正常显示了。

c、word中添加图片之后,xml里边就会多出一个<w:pict>标签,内容如下(以我本地的为例):

  1. <w:pict>
  2. <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
  3. <v:stroke joinstyle="miter"/>
  4. <v:formulas>
  5. <v:f eqn="if lineDrawn pixelLineWidth 0"/>
  6. <v:f eqn="sum @0 1 0"/>
  7. <v:f eqn="sum 0 0 @1"/>
  8. <v:f eqn="prod @2 1 2"/>
  9. <v:f eqn="prod @3 21600 pixelWidth"/>
  10. <v:f eqn="prod @3 21600 pixelHeight"/>
  11. <v:f eqn="sum @0 0 1"/>
  12. <v:f eqn="prod @6 1 2"/>
  13. <v:f eqn="prod @7 21600 pixelWidth"/>
  14. <v:f eqn="sum @8 21600 0"/>
  15. <v:f eqn="prod @7 21600 pixelHeight"/>
  16. <v:f eqn="sum @10 21600 0"/>
  17. </v:formulas>
  18. <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
  19. <o:lock v:ext="edit" aspectratio="t"/>
  20. </v:shapetype>
  21. <w:binData w:name="wordml://03000001.png" xml:space="preserve">${field30}</w:binData>
  22. <v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style="width:90.35pt;height:112.75pt">
  23. <v:imagedata src="wordml://03000001.png" o:href="http://127.0.0.1:8080/bfp/2016/12/30/00000000001.png"/>
  24. </v:shape>
  25. </w:pict>

我们需要用到的是<w:binData>,这个标签中间用来显示图片内容(通常都是base64编码),也就是要使用占位符的地方,我这里用的是${field30}。

若需要调整别的可以直接修改其他标签内容。

d、使用java代码将图片生成base64编码:

  1. /**
  2. * 该方法用来将指定的文件转换成base64编码
  3. * @param path:图片路径
  4. * **/
  5. private String getImageStr(String path){
  6. //1、校验是否为空
  7. if(path==null || path.trim().length()<=0){return "";}
  8. //2、校验文件是否为目录或者是否存在
  9. File picFile = new File(path);
  10. if(picFile.isDirectory() || (!picFile.exists())) return "";
  11. //3、校验是否为图片
  12. try {
  13. BufferedImage image =ImageIO.read(picFile);
  14. if (image == null) {
  15. return "";
  16. }
  17. } catch(IOException ex) {
  18. ex.printStackTrace();
  19. return "";
  20. }
  21. //4、转换成base64编码
  22. String imageStr = "";
  23. try {
  24. byte[] data = null;
  25. InputStream in = new FileInputStream(path);
  26. data = new byte[in.available()];
  27. in.read(data);
  28. BASE64Encoder encoder = new BASE64Encoder();
  29. imageStr = encoder.encode(data);
  30. } catch (Exception e) {
  31. imageStr="";
  32. e.printStackTrace();
  33. }
  34. return imageStr;
  35. }

2、生成html:

a、模板文件中直接使用img标签显示即可,如:<img width="120" height="150"  src="${field30}" />。

b、src中可以直接放图片的路径,也可以放base64编码。若是使用绝对路径,需要添加前缀:file:///。如图片路径为:D:/temp/1.png,那么src="file:///D:/temp/1.png"。这样子才能显示出来。缺点:因为图片通常都存在服务器端,在服务器端显示图片自然没有问题,若是放到客户端因为指定目录下没有文件那么页面中的图片自然就显示不出来了。

c、使用base64编码显示图片。若是在src属性中直接加载base64编码的图片,形如:src="base64编码",这样的图片也显示不出来,还需要添加形如data:image/图片格式;base64,的前缀。如显示png格式的图片,src="data:image/png;base64,base64编码“,如此才能显示出来。(测试了一下,火狐、360、谷歌、IE11、IE8都能很好的支持,其他浏览器没测过)

3、生成pdf:

a、生成pdf我分成了两步:先使用freemarker生成html文件,然后使用flying saucer将html转成pdf文件。

b、直接使用“base64编码显示图片”生成的HTML文件,转成pdf时,图片会显示不出来(html文件自然是能正常显示的),具体原因未知。解决办法是采用绝对路径。先使用绝对路径的方法生成html文件中的图片,此时图片和html文件都在服务器端,图片自然能正常显示,然后将该文件转成pdf。在客户端下载下来之后,图片也能正常显示。
 
 

使用freemarker生成word、html时图片显示问题的更多相关文章

  1. springboot中使用freemarker生成word文档并打包成zip下载(简历)

    一.设计出的简历模板图以及给的简历小图标切图         二.按照简历模板图新建简历word文件 :${字段名},同时将图片插入到word中,并将建好的word文件另存为xml文件:    三.直 ...

  2. Java Freemarker生成word

    Java Freemarker生成word freeMaker 简介: FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代 ...

  3. Java利用poi生成word(包含插入图片,动态表格,行合并)

    转(小改): Java利用poi生成word(包含插入图片,动态表格,行合并) 2018年12月20日 09:06:51 wjw_11093010 阅读数:70 Java利用poi生成word(包含插 ...

  4. Java Web项目中使用Freemarker生成Word文档遇到的问题

    这段时间项目中使用了freemarker生成word文档.在项目中遇到了几个问题,在这里记录一下.首先就是关于遍历遇到的坑.整行整行的遍历是很简单的,只需要在整行的<w:tr></w ...

  5. FreeMarker生成word

    FreeMarker生成word数据填充是通过,Map填充. Map dataMap = new HashMap<String, Object>(); List<User> l ...

  6. freemarker生成word,表格分页

    在做项目的过程中,使用到了freemarker生成word.又有一个需求,明细的要确定有多少页,这就用到了换页的xml标签了,找了我好久 <w:p ><w:r><w:br ...

  7. 用 Freemarker 生成 word 文档(包含图片)

    1. 用word写一个需要导出的word模板,然后存为xml格式. 2. 将xml中需要动态修改内容的地方,换成freemarker的标识符,例如: <w:p wsp:rsidR="0 ...

  8. FreeMarker生成Word文档

    FreeMarker简介: FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具,它不是面向最终用户的,而是一个 ...

  9. java使用freemarker 生成word文档

      java 生成word文档     最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的 ...

随机推荐

  1. 加密SecurityHelper

    接下来给大家分享一下我用的加密helper,现在只用的md5加密的方法,网上很多方法找到的时候加密完了会变成乱码,这样对于密码这种字段保存的时候就会出错.其实只需要把加密完的byte字节转化成16位就 ...

  2. Halcon介绍和下载安装视频教程

    ------------------------Halcon,Visionpro高清视频教程,点击下载视频--------------------------

  3. 彻底删除win10的 Windows Defender

    使用删除工具和一些教程,都无法删除,最后找到了这个: https://www.newasp.net/soft/351946.html 关闭掉服务后,在C盘全盘搜索,删除,完成了

  4. quartz入门实例

    一 Quarta介绍 1 Quartz是什么 Quartz就是一个纯 Java 实现的作业调度工具,相当于数据库中的 Job.Windows 的计划任务.Unix/Linux 下的 Cron,但 Qu ...

  5. 定点数(fixed-point number)

    定义 定点数(fixed-point number)就是小数点位置固定的数,也就是说,小数点后面的位数是固定的,比如要记录一笔账目,这些账目的数字都不会超过100,就可以使用2位小数位定点数来记录,比 ...

  6. Python学习之路5 - 函数

    函数 定义方式: def func(): "这里面写函数的描述" 这里写代码 return x #如果没有返回值就叫"过程",函数和过程的区别就是有无返回值 实 ...

  7. 计算器软件实现系列(七)WPF+SQL+策略模式

    一  整体概述 本次设计主要是在WPF的页面中实现的,属于表现层的更换,数据库部分用的还是数据库的封装,其中引用了策略模式 二  设计思路 1 在出题页面,进行试题的编辑,在编辑后会自动保存到数据库中 ...

  8. Node js MongoDB简单操作

    //win7环境下node要先安装MongoDB的相关组件(非安装MongoDB数据库),在cmd命令行进入node项目目录后执行以下语句 //npm install mongodb //创建连接 v ...

  9. SQL SERVER技术内幕之8 分组集

    分组集就是分组(GROUP BY子句)使用的一组属性,在传统的SQL中,一个聚合查询只能定义一个分组集: 假设现在不想生成4个单独的结果集,而是希望生成一个统一的结果集,其中包含所有4个分组集的聚合 ...

  10. ADO.NET中DataSet、DataTable、DataRow的数据复制方法

    DataSet 对象是支持 ADO.NET的断开式.分布式数据方案的核心对象 ,用途非常广泛.我们很多时候需要使用其中的数据,比如取得一个DataTable的数据或者复制另一个DataTabe中的数据 ...