`

Freemarker+IText生成pdf文件

    博客分类:
  • J2SE
阅读更多

       最近项目中遇到要用html生成pdf文件的需求,一开始研究了下前端插件jspdf,使用h5 canvas绘图生成图片,再把图片生成pdf文件,遇到了各种各样的问题,生成的pdf文件达到20多M,height超过5000浏览器就崩溃,有兴趣的童鞋可以尝试一下,该方案LZ最终放弃了。

       接着开始尝试服务端生成,使用freemaker模板生成静态html文件,通过iext生成pdf,网上很多关于renderer.setDocument(dom,null)的用法,LZ尝试后发现效率奇低,最后放弃了,直接使用renderer.setDocumentFromString方法,要注意以下几点:

       1、生成的html声明文件,xhtml部分要干掉,否则解析报错。

       2、注意设置相对目录,一定要物理绝对目录,否者css和img文件就找不到了。

       3、生成pdf时中文的问题,就是要加载字体文件simsun.ttc,这个网上解决方案不少,不做赘述,注意html加上样式。

<style>
body{
	font-family: SimSun;
}
</style>

 

public void exportPDF() throws Exception
{
	OutputStream os = null;
	String htmlStr;
	Map<String, Object> params = new HashMap<String, Object>();
	Map data = new HashMap();
	try {
		/**
                xxx数据生成逻辑
                **/
		data.put("projects",xxx);
		
		//通过freemaker模板生成html
		htmlStr = HtmlGenerator.generate("pdf.ftl", data);
		String appPath = getReq().getSession().getServletContext().getRealPath("/") + File.separator;
		ITextRenderer renderer = new ITextRenderer();
		renderer.setDocumentFromString(htmlStr,"file:" + appPath);

		// 解决中文支持问题
		ITextFontResolver fontResolver = renderer.getFontResolver();
		fontResolver.addFont(appPath + "template" + File.separator +"simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
		
		//生成pdf文件
		getRes().setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("测试", "UTF-8") + new Date().getTime() + ".pdf");     
		getRes().setContentType("application/pdf");
		os = getRes().getOutputStream();
		renderer.layout();
		renderer.createPDF(os, true);
		
		os.flush();
	} catch (Exception e) {
		e.printStackTrace();
	}finally {
		if (null != os) {
			try {
				os.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
    
}

    HtmlGenerator类,编码设置UTF-8,设置正确,不然有中文乱码问题。

package com.haziwang.rkhy.util;   
  
import java.io.BufferedWriter;
import java.io.StringWriter;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;   
  
public class HtmlGenerator {   
    /**
     * @param template
     * @param variables
     * @return
     * @throws Exception
     */
    public static String generate(String template, Map params) throws Exception{   
        Configuration config = FreemarkerConfiguration.getConfiguation();  
        config.setDefaultEncoding("UTF-8");
        Template tp = config.getTemplate(template);   
        StringWriter stringWriter = new StringWriter(); 
        BufferedWriter writer = new BufferedWriter(stringWriter);  
        tp.setEncoding("UTF-8");     
        tp.process(params, writer);     
        String htmlStr = stringWriter.toString();   
        writer.flush();     
        writer.close();   
        return htmlStr;   
    }   
  
}  

    FreemarkerConfiguration类,设置ftl文件目录,相对于classes目录设置

package com.haziwang.rkhy.util;

import freemarker.template.Configuration;

public class FreemarkerConfiguration {   
       
    private static Configuration config = null;   
       
    /**  
     * Static initialization.  
     *   
     * Initialize the configuration of Freemarker.  
     */  
    static{   
        config = new Configuration();   
        config.setClassForTemplateLoading(FreemarkerConfiguration.class, "/../../template/");   
        config.setTemplateUpdateDelay(0);
    }   
       
    public static Configuration getConfiguation(){   
        return config;   
    }   
  
}  

   代码目录结构

    maven引入jar包

<dependency>
	<artifactId>
		flying-saucer-pdf-itext5
	</artifactId>
	<groupId>
		org.xhtmlrenderer
	</groupId>
	<version>
		9.0.6
	</version>
</dependency>
<dependency>
	<artifactId>
		freemarker
	</artifactId>
	<groupId>
		freemarker
	</groupId>
	<version>
		2.3.8
	</version>
</dependency>
  • 描述: 工程目录
  • 大小: 20.7 KB
0
3
分享到:
评论
4 楼 南疆战士 2018-01-09  
871554023 写道
怎样做可以生成多页呢

本来就是生成多页啊,内容多了自然会分页的。
3 楼 871554023 2017-12-15  
怎样做可以生成多页呢
2 楼 871554023 2017-12-15  
就是生成的pdf文件里只有一页
1 楼 871554023 2017-12-15  
为什么不可以批量生成呢

相关推荐

    freemarker+itext生成PDF

    NULL 博文链接:https://yizhaorong.iteye.com/blog/2157848

    java html模板 itext 生成pdf 页眉页脚 合并pdf列子

    搜索了好多篇例子,算是强拼硬凑成现在的...此包中包含可测试成功代码,关联模板、字体文件、jar等 希望能帮助到大家。 这篇文章的作者蛮厉害,有不少借鉴。 http://blog.csdn.net/layman1024/article/details/74628658

    java根据动态模板生成pdf(包含柱状图)所需jar包

    java根据动态模板生成pdf(包含柱状图)所需jar包 iText+FreeMarker+JFreeChart生成可动态配置的PDF文档。 iText有很强大的PDF处理能力,但是样式和排版不好控制,直接写PDF文档,数据的动态渲染很麻烦。 FreeMarker...

    JAVA项目代码绘制PDF和通过freemarker动态生成PDF

    对于没有使用宏、函数等word、excel,需要按模板动态生成word、excel、html,只需要一个freemarker,先将word、excel、html等另存为**xml**,即可使用模板动态生成文件,目前xlsx是不支持的 4. PdfTemplate 对于不会...

    Java+电子签名,生成PDF格式的合同

    通过freemarker进行渲染,由html生成合同pdf。 查找指定电子签名的位置,然后再在指定位置插入签名图片,生成最终pdf。

    导出word和pdf模板示例文件

    freemarker+itext5实现用模板方式,导出word和pdf 的模板示例文件,使用已经简单编写的word,生成的xml文件和html.

    java生成pdf(利用dom4j、freemarker生成固定模板格式的pdf文件)

    iText,生成PDF文档,还支持将XML、Html文件转化为PDF文件; Apache PDFBox,生成、合并PDF文档; docx4j,生成docx、pptx、xlsx文档,支持转换为PDF格式。 比较: iText开源协议为AGPL,而其他两个框架协议均为...

    Java实现HTML页面转PDF解决方案

    而目前开源的组件中,Itext的确是一个First Choice,如果各位单纯是做把图片转成PDF或者自己写了Velocity或者FreeMarker模板生成了HTML是非常推荐直接用Itext来进行的。而如果,大家像我这样已经有前人写好了HTML...

    freemarker生成html导出word

    使用Itextpdf组件通过freemarker模板技术生成好html内容并导出word文件,提供下载。

    pdf-kit-master.zip|pdf-kit-master.zip

    java根据模板动态生成PDF文件 iText+FreeMarker+JFreeChart生成可动态配置的PDF文档 iText有很强大的PDF处理能力,但是样式和排版不好控制,直接写PDF文档,数据的动态渲染很麻烦。 FreeMarker能配置动态的...

    java根据模板导出PDF详细教程(包含统计图)

    根据业务需要,需要在服务器端生成可动态配置的PDF文档,方便数据可视化查看。此文的测试是在客户端通过java程序的测试,直接运行java类获得成功!

    java后台实现pdf下载导出

    java后台实现pdf下载,利用模板进行数据页面布局的设计,利用freemarkerm模板引擎可以方便快捷进行数据的绑定,还可以根据相关标签进行页面的优化,嵌入。

    java根据模板导出PDF详细教程(包含统计图).rar

    根据业务需要,需要在服务器端生成可动态配置的PDF文档,方便数据可视化查看。此文的测试是在客户端通过java程序的测试,直接运行java类获得成功!

    flyingsaucer-R8.zip

    一个很好用的工具,可以将HTML直接转成PDF文件,包括PDF的字体、PDF的格式、Image如何处理等等,结合freemarker模板可以很好的做到PDF文件的导出。

    web开发常用jar

    通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。 iTextAsian.jar itext中关于亚洲编码的类库,在这里用于中文字体的输入。 junit.jar Junit包,当你运行Hibernate自带的测试...

    java开发常用jar包

    通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。 iTextAsian.jar itext中关于亚洲编码的类库,在这里用于中文字体的输入。 junit.jar Junit包,当你运行Hibernate自带的测试代码的...

    JAVA上百实例源码以及开源项目

     数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录  一个Java+ajax写...

    JAVA上百实例源码以及开源项目源代码

     数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录  一个Java+ajax写...

Global site tag (gtag.js) - Google Analytics