`

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

    这篇博客 "freemarker+itext生成PDF" 可能详细介绍了如何结合这两者来生成PDF文件,这在报表生成、发票打印或任何需要静态化输出的场景中非常有用。 首先,让我们了解FreeMarker。FreeMarker是一个基于模板的语言,...

    freemarker+html生成pdf.zip

    `Freemarker`是一个强大的模板引擎,通常用于动态生成HTML、XML等文本格式,而将`Freemarker`与HTML模板结合生成PDF,可以充分利用HTML的易编辑性和富文本特性,为用户提供高质量的文档输出。下面我们将深入探讨如何...

    基于itext7+freemarker模板导出pdf

    在IT领域,生成PDF文档是常见的需求,尤其在报表、合同和文档自动化中。本教程将探讨如何使用iText7和FreeMarker库结合,来创建一个基于模板的PDF生成流程,确保中文支持和图片的正常显示。 首先,iText7是一款强大...

    SpringBoot集成Freemarker+FlyingSaucer实现pdf在线预览.pdf

    然后,创建一个 PdfUtils 工具类,用于生成PDF文档。 四、PDF工具类编写 PdfUtils工具类主要用于生成PDF文档。该类中包含了生成HTML模板、将HTML模板转换为PDF文档的方法。方法上有完整的注释,思路是利用模板引擎...

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

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

    springboot使用itext生成pdf并保存到本地

    总结一下,要实现在Spring Boot应用中使用iText生成带有页眉、页码、水印、目录和二维码的PDF,你需要: 1. 引入iText及相关库。 2. 创建HTML页面并将其转换为PDF。 3. 定制PDF内容,包括添加页眉、页码和水印。 4. ...

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

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

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

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

    导出pdf的一种实现方式 freemark+itext

    总结起来,“freemark+itext”方案提供了一种灵活且强大的方式来生成PDF文档。FreeMarker允许我们使用模板语言来描述文档的结构,而iText则负责将这些结构转换为PDF格式。这种组合使得开发人员能够快速地根据业务...

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

    在Java开发中,生成PDF文件是一项常见的需求,特别是在企业级应用中,如生成合同、报告等文档。FreeMarker是一个强大的模板引擎,常用于生成HTML、XML等动态内容,但也可以结合其他库来生成PDF。本篇文章将深入探讨...

    itext生成pdf所需的jar包

    iText支持动态生成PDF,包括添加文本、图像、表格、超链接、水印等元素。在处理复杂的PDF生成需求时,iText通常是一个可靠的选择。它不仅适用于Java环境,还有.NET平台的版本。 其次,我们要提到的是Freemarker。...

    基于SpringBoot实现的生成工资条源代码,使用FreeMarker模板引擎, iTextPdf生成工资条PDF

    5. 使用iTextPdf生成PDF:将渲染后的HTML转换为PDF,可以利用iTextPdf提供的`Document`、`PdfWriter`、`HtmlConverter`等类完成这个过程。 6. 提供下载接口:在控制器层创建一个HTTP接口,当用户访问这个接口时,...

    freemarker解析成pdf

    本篇文章将深入探讨如何利用Freemarker来解析并生成PDF文件。 首先,理解Freemarker的基本概念至关重要。Freemarker是一个基于模板的、与语言无关的模板引擎,它的主要工作是将数据模型和模板结合,生成最终的输出...

    EOS 中使用freemarker模板生成PDF文件导出

    总的来说,利用EOS和Freemarker生成PDF文件是一项实用的技术,它结合了模板引擎的灵活性和PDF格式的专业性,使得动态内容的输出变得简单高效。在实际开发中,根据项目需求选择合适的工具和技术栈,能有效提升开发...

    itextpdf将html生成pdf所需要的全部jar

    在实际应用中,这些JAR文件通常会组合使用,首先,JFinal可能用于处理Web请求和数据库交互,获取需要生成PDF的HTML内容;接着,FreeMarker处理HTML模板并填充数据;然后,XMLWorker将处理后的HTML转化为iText可以...

    html模板结合itextpdf生成pdf文档--demo

    本教程主要探讨如何利用HTML模板和iTextPDF库来创建PDF文件,同时也会提及Apache POI和Freemarker在导出Excel方面的应用,以及如何在PDF上添加文字水印。 首先,iTextPDF是一个强大的Java库,专门用于生成和修改PDF...

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

    然后,将这些数据模型与模板结合,通过Freemarker的API生成PDF文档。 2. **插入电子签名**: 生成PDF后,我们需要找到合适的签名位置。这通常可以通过PDF坐标系统来实现,可以是预设的固定位置,也可以根据文档...

    iText+Flying Saucer生成pdf文档所需要的jar包

    在“iText+Flying Saucer生成pdf文档jar包(修改后的)”这个描述中,"修改后的"可能指的是开发者对原始库进行了一些定制,以更好地支持中文显示。这可能包括修改字体设置、编码处理或者解决了某些特定的中文排版...

    itext 导出pdf 例子

    本示例将深入讲解如何利用iText库来导出PDF文件,以满足特定的需求。 首先,确保已将iText库添加到项目依赖中。通常,可以通过Maven或Gradle来引入。对于Maven项目,可以在pom.xml文件中添加以下依赖: ```xml ...

    Freemarker导出 word 和 pdf 工具类

    Freemarker是一款强大的Java...总结,使用Freemarker导出Word和PDF文档是一种常见的技术手段,结合合适的库和精心设计的工具类,可以高效地实现动态文档生成。理解这些知识点对于提升开发效率和产品质量具有重要意义。

Global site tag (gtag.js) - Google Analytics