使用freemarker生成word、html时图片显示问题

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

 

1、生成word

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

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

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

Xml代码   收藏代码
  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编码:
Java代码   收藏代码
  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.       
  9.     //2、校验文件是否为目录或者是否存在  
  10.     File picFile = new File(path);  
  11.     if(picFile.isDirectory() || (!picFile.exists())) return "";  
  12.       
  13.     //3、校验是否为图片  
  14.     try {    
  15.         BufferedImage image =ImageIO.read(picFile);    
  16.         if (image == null) {    
  17.             return "";  
  18.         }    
  19.     } catch(IOException ex) {   
  20.         ex.printStackTrace();  
  21.         return "";  
  22.     }  
  23.       
  24.     //4、转换成base64编码  
  25.     String imageStr = "";  
  26.     try {  
  27.         byte[] data = null;  
  28.         InputStream in = new FileInputStream(path);  
  29.         data = new byte[in.available()];  
  30.         in.read(data);  
  31.         BASE64Encoder encoder = new BASE64Encoder();  
  32.         imageStr = encoder.encode(data);  
  33.     } catch (Exception e) {  
  34.         imageStr="";  
  35.         e.printStackTrace();  
  36.     }  
  37.       
  38.     return imageStr;  
  39. }  
 

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。在客户端下载下来之后,图片也能正常显示。
 
 

转载于:https://www.cnblogs.com/oskyhg/p/7256227.html

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 为了更好地理解这个问题,需要了解一下问题中提到的两个关键词,分别是freemarkerwordFreemarker是一种Java模板引擎,它可以用于生成各种文本格式的文件,包括Word、Excel、HTML等。 Word是微软公司开发的一种文字处理软件,它可以用于创建、编辑、格式化和打印文档。 回到问题本身,如果说使用Freemarker生成Word文档打不开,那么可能是因为Freemarker生成Word文件格式与当前环境中安装的Word软件版本不兼容,或者是在生成Word文件出现了错误。 如果想要解决这个问题,可以尝试以下几个方法: 1.检查当前使用Word版本,确认其支持当前Freemarker生成Word文件格式。 2.检查Freemarker生成Word文件的代码逻辑,确认没有出现逻辑错误或者数据异常。 3.尝试换用其他模板引擎,比如Velocity或者JSP等,看看是否会出现同样的问题。 总的来说,这个问题涉及到多个方面,解决起来可能需要一些技术知识和实践经验。 ### 回答2: Freemarker是一个基于模板生成文本的Java框架,可以用来生成HTML、XML、JSON、JavaScript、SQL等各种文本格式,因此也可以用来生成Word文档。但是有候会遇到生成Word文档打不开的问题,以下是可能的原因和解决方法。 1. 模板文件格式问题 生成Word文档需要使用Word的文档格式,一般情况下是doc或docx格式。如果使用的模板文件格式不正确,就无法正确生成Word文档。建议使用Word自己的模板文件,并将其另存为doc或docx格式。 2. Freemarker生成的文本问题 如果Freemarker生成的文本不符合Word的文档格式规范,也会导致生成Word文档打不开。建议使用Word的模板,并在其中插入Freemarker生成的内容。此外,还需要注意生成的文本中不要包含Word不支持的HTML标签等内容。 3. 编码问题 如果Freemarker生成的文本和模板文件使用了不同的编码方式,也会导致生成Word文档打不开。建议使用统一的编码方式,比如UTF-8。 4. Word版本问题 不同版本的Word支持的文档格式不同,如果生成Word文档使用的是较新的格式,在旧版本的Word中可能无法打开。建议使用与目标用户相同版本的Word。 综上所述,如果遇到freemarker生成word打不开的问题,可以从上述几个方面进行排查。如果无法解决,建议向专业的技术支持人员寻求帮助。 ### 回答3: Freemarker是一款流行的模板引擎,广泛应用于各种Java项目中。通过使用Freemarker,我们可以方便地生成各种格式的文档,包括Word文档。但有我们可能会遇到这样的问题Freemarker生成Word文件打不开。 这个问题可能有多种原因,下面列举几种可能的情况: 1. Word的版本问题。在生成Word文档,我们需要指定生成的文档格式。如果指定的格式和用户的Word版本不兼容,就会导致无法打开。解决方法是检查生成Word文档格式和用户的Word版本是否兼容,如果不兼容,可以尝试更换格式或者升级Word版本。 2. 文件名和后缀问题。有些候,我们在生成Word文档可能没有正确地指定文件名和后缀,导致无法识别。解决方法是检查生成Word文件名和后缀是否正确,确认无误后重新生成。 3. 模板文件问题。有候我们可能会在模板文件中包含了一些特殊字符或格式,导致生成Word文档无法打开。解决方法是检查模板文件是否正确,确认模板文件无误后重新生成。 4. Freemarker版本问题Freemarker的不同版本可能有不同的特性和兼容性问题。如果使用的是过Freemarker版本,就可能导致生成Word文档无法打开。解决方法是升级Freemarker版本,或者按照兼容性指南使用特定的版本。 总的来说,导致Freemarker生成Word文档无法打开的原因可能有很多,我们需要逐一排查。如果遇到无法解决的问题,可以考虑使用其他的文档生成工具,或者咨询相关的技术支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值