`
阅读更多

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

 

1、生成word

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

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

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

<w:pict>
<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">
	<v:stroke joinstyle="miter"/>
	<v:formulas>
		<v:f eqn="if lineDrawn pixelLineWidth 0"/>
		<v:f eqn="sum @0 1 0"/>
		<v:f eqn="sum 0 0 @1"/>
		<v:f eqn="prod @2 1 2"/>
		<v:f eqn="prod @3 21600 pixelWidth"/>
		<v:f eqn="prod @3 21600 pixelHeight"/>
		<v:f eqn="sum @0 0 1"/>
		<v:f eqn="prod @6 1 2"/>
		<v:f eqn="prod @7 21600 pixelWidth"/>
		<v:f eqn="sum @8 21600 0"/>
		<v:f eqn="prod @7 21600 pixelHeight"/>
		<v:f eqn="sum @10 21600 0"/>
	</v:formulas>
	<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
	<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype>
<w:binData w:name="wordml://03000001.png" xml:space="preserve">${field30}</w:binData>
<v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style="width:90.35pt;height:112.75pt">
<v:imagedata src="wordml://03000001.png" o:href="http://127.0.0.1:8080/bfp/2016/12/30/00000000001.png"/>
</v:shape>
</w:pict>
我们需要用到的是<w:binData>,这个标签中间用来显示图片内容(通常都是base64编码),也就是要使用占位符的地方,我这里用的是${field30}。

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

 

d、使用java代码将图片生成base64编码:
/**
 * 该方法用来将指定的文件转换成base64编码
 * @param path:图片路径
 * **/
private String getImageStr(String path){
	//1、校验是否为空
	if(path==null || path.trim().length()<=0){return "";}
	
	//2、校验文件是否为目录或者是否存在
	File picFile = new File(path);
	if(picFile.isDirectory() || (!picFile.exists())) return "";
	
	//3、校验是否为图片
	try {  
	    BufferedImage image =ImageIO.read(picFile);  
	    if (image == null) {  
	    	return "";
	    }  
	} catch(IOException ex) { 
		ex.printStackTrace();
		return "";
	}
	
	//4、转换成base64编码
	String imageStr = "";
	try {
		byte[] data = null;
		InputStream in = new FileInputStream(path);
		data = new byte[in.available()];
		in.read(data);
		BASE64Encoder encoder = new BASE64Encoder();
		imageStr = encoder.encode(data);
	} catch (Exception e) {
		imageStr="";
		e.printStackTrace();
	}
	
	return imageStr;
}
 

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

相关推荐

    freemarkerdemo 生成word 插入图片

    在这个"freemarkerdemo生成word插入图片"的示例中,我们主要探讨如何利用Freemarker来创建Word文档,并且将图片集成到这些文档中。这个过程涉及到几个关键的技术点: 1. **Freemarker基础知识**:Freemarker是一个...

    freemarker 生成word,支持一个单元格生成多张图片

    在生成Word文档时,我们使用Apache POI创建一个Word文档对象,接着创建表格并添加行。在每个单元格中,我们利用POI API插入图片,图片数据来自FreeMarker处理后的结果。FreeMarker将图片的二进制数据转换成`...

    FreeMarker生成word文件

    以下是关于如何使用FreeMarker生成Word文件的一些关键知识点: 1. **FreeMarker模板语言**:FreeMarker使用一种简单的模板语言,允许开发者通过定义变量和控制结构(如循环和条件语句)来动态地插入数据。在模板中...

    利用FreeMarker生成word文件例子

    ### 使用FreeMarker生成Word文档 1. **配置FreeMarker**:首先,需要在项目中引入FreeMarker的依赖,例如通过Maven或Gradle添加对应的依赖库。然后,配置FreeMarker的环境,包括设置模板目录、缓存策略等。 2. **...

    java+Freemarker生成word

    在Java中使用Freemarker生成Word文档的过程主要包括以下几个步骤: 1. **环境配置**:首先,你需要在项目中引入必要的库,包括Apache POI用于处理Word文档,以及Freemarker库。在Maven项目中,可以在pom.xml文件中...

    java freemarker导出word -包含多张图片导出

    5. **生成Word文档** 使用Apache POI创建一个新的Word文档,并在其中添加FreeMarker模板。在模型中设置图片对象,然后使用FreeMarker的`Template`类将模板和模型合并,生成最终的Word文档内容。 6. **嵌入图片** ...

    freemarker根据word模板生成word的完整示例

    在这个示例中,我们将深入探讨如何使用Freemarker根据XML模板生成Word文档。 首先,你需要了解Freemarker的基本概念。Freemarker是一个基于模板的语言,它的核心是模板文件,模板文件中包含了一系列控制结构(如...

    Freemarker导出word示例,包括jfreechart图表

    在模板中,我们可以使用类似于HTML的`&lt;img&gt;`标签,将图片的路径作为`src`属性,这样在生成Word文档时,Freemarker会将这些图片插入到相应位置。 在实际操作中,可能需要以下步骤: 1. 创建Freemarker模板,定义好...

    FreeMarker+poi 模板生成word+导入图片

    以上就是FreeMarker与Apache POI结合生成Word文档并插入图片的基本流程。这种组合可以灵活地创建复杂的动态文档,适应各种需求,例如报告生成、批量文档定制等。开发者可以根据具体需求调整模板设计和数据模型,以...

    Java中使用 FreeMarker 生成pdf盖章合同文件

    Java中使用FreeMarker生成PDF合同文件的过程主要包括配置FreeMarker环境、创建数据模型、解析模板、生成PDF以及添加图片盖章。通过结合FreeMarker的灵活性和Flying Saucer的转换能力,我们可以方便地将动态生成的...

    用freemarker生成word.zip

    在使用FreeMarker生成Word之前,需要准备一个数据模型,包含要插入到文档中的文本和图片。图片可以作为`byte[]`数组存储,例如: ```java Map, Object&gt; dataModel = new HashMap(); dataModel.put("title", ...

    springmvc采用freemarker动态生成带图片的word

    在本项目中,我们将探讨如何利用SpringMVC与Freemarker来动态生成带有图片的Word文档。 SpringMVC是Spring框架的一部分,它是一个强大的Model-View-Controller(MVC)架构,用于开发Java Web应用程序。它提供了模型...

    java通过freemarker模板导出word含图片

    在Java中,FreeMarker可以用来生成Word文档,只需要为Word模板提供合适的数据模型。 1. **环境配置**: 在项目中引入FreeMarker的依赖,通常通过Maven或Gradle进行管理。确保添加了`freemarker.jar`和可能需要的...

    word文档生成html模板(freemarker)再转为pdf示例代码

    1、Word模板转html模板的操作步骤(图示例+操作描述,13张图); 2、由上述生成的html模板通过java代码生成pdf;...阅读建议:按照上述操作步骤,先看README.md文档,再看other/生成html操作步骤目录下的图片。

    freemarker生成word

    本篇文章将深入探讨如何使用FreeMarker生成Word文档。 1. FreeMarker 概述: FreeMarker 是一个基于模板的Java库,它允许开发者通过模板语言将数据模型与HTML、XML或其他文本格式分离。模板是纯文本文件,包含控制...

    freemarker无损生成word

    在生成Word文档时,我们通常会创建一个FTL(FreeMarker模板语言)文件,该文件包含了静态文本和变量占位符。这些变量在运行时会被Java对象中的数据替换。 首先,我们需要在项目中引入FreeMarker库,可以通过Maven或...

    java使用freemarker生成复杂的word文档

    Java中的Freemarker是一个强大的模板引擎,常用于生成动态HTML、XML或文本文件,而这里我们讨论的是如何利用Freemarker生成复杂的Word文档。在Java应用中,有时我们需要生成结构化且内容丰富的Word文档,例如报告、...

    生成WORD freemarker导出WORD

    本项目“生成WORD freemarker导出WORD”正是这样一个解决方案,它允许开发者使用FreeMarker模板来创建和导出Microsoft Word文件。 首先,我们要理解FreeMarker的工作原理。FreeMarker是一个基于Java的模板语言,它...

    Springboot+freemarker生成word

    首先,为了使用Spring Boot和FreeMarker生成Word文档,我们需要引入相应的依赖。Spring Boot的起步依赖中已经包含了对FreeMarker的支持,但我们需要添加处理Word文档的库,如Apache POI。在`pom.xml`文件中,添加...

    freemarker模板导出word循环图片表格源码和详细教程

    在Java代码中,我们需要构建数据模型,包括图片列表和表格数据,然后使用`Configuration`和`Template`对象将模型数据与模板结合,生成Word文档。Apache POI库可以帮助我们操作Word文档,如设置样式、调整图片大小等...

Global site tag (gtag.js) - Google Analytics