`

PDF生产方案 maven + freemarker + flyingSoaser 实现 附代码

 
阅读更多

        flyingSauser是一个非常好的生成PDF的开源项目,在文章中http://tommy-lu.iteye.com/admin/blogs/2224190也有提到,下面就使用 maven + freemarker + flyingSauser来搭建一个生成PDF的一个web项目。

    一、搭建maven项目

      使用过maven的人对这个应该不陌生,我这里是使用的是MyEclipse搭建maven项目,MyEclipse很好的集成了maven,使用起来非常的方便。在本例中我的项目名称是:flyingSauser-generatePDF,项目结构如下:



 

 

 

    二、编写初始化freemarker的类

       新建完毕项目之后,下面就开始干活了,这里我新建了一个类叫WrapFreemarkerHttpServlet,这个类主要就是用来实例化freemarker的Configuration,该类还集成了HttpServlet,这样如果我们的servlet的需要使用freemarker功能,只要继承这个类就可以了,然后子类只需要在init的方法里面调用super.init();方法即可,这样就达到了再servlet的生命周期里面只需要进行一次初始化freemarker。WrapFreemarkerHttpServlet类如下:

       

package com.cn.luqingyun.common;

import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import freemarker.core.ParseException;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;

public class WrapFreemarkerHttpServlet extends HttpServlet {
	
	
	private static final long serialVersionUID = 1L;
	private Configuration cfg;
	
	public void init() throws ServletException {
		try {
			//获取模板所在文件夹参数,这个参数在web.xml里面配置。
			String freemarkerTemplatesFolder = this.getServletContext().getInitParameter("freemarkerTemplatesFolder");
			/* 在整个应用的生命周期中,这个工作你应该只做一次。 */
			/* 创建和调整配置。 */
			cfg = new Configuration(Configuration.getVersion());
			
			//获取模板文件夹路径
			String freemarkerTemplatesUrl = this.getServletContext().getRealPath("/" + freemarkerTemplatesFolder);
			
			//让freemarker从指定文件夹加载模板文件
			cfg.setDirectoryForTemplateLoading(new File(freemarkerTemplatesUrl));
			cfg.setObjectWrapper(new DefaultObjectWrapper(Configuration
					.getVersion()));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 输出数据到模板,子类只需要调用该方法,即可将数据输出到模板中
	 * @param templateFileName 模板名称
	 * @param root 数据模型
	 * @param os 
	 * @throws IOException 
	 * @throws ParseException 
	 * @throws MalformedTemplateNameException 
	 * @throws TemplateNotFoundException 
	 * @throws TemplateException 
	 */
	protected void process(String templateFileName, Map root,Writer os) throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException, TemplateException {
		/* 获取或创建模板 */
		Template temp = cfg.getTemplate(templateFileName,"UTF-8");
		/* 将模板和数据模型合并 */
		// 注意:
		// 为了简单起见,这里压制了异常(在方法签名中声明了异常,译者注),而在正式运行的产品中不要这样做。;
		temp.process(root, os);
		os.flush();
	}
	

}

 

 

    三、编写生成PDF的servlet

        该类继承了WrapFreemarkerHttpServlet,在init()方法里面调用了super.init();主要就是初始化 freemarker,这个类有一行代码非常重要,fontResolver.addFont("fonts/simsun.ttc", BaseFont.IDENTITY_H,     BaseFont.NOT_EMBEDDED);这行代码是为了使flyingSauser支持中文,文件simsun.ttc需要放在类路径下面即可。该类的代码如下:

 

package com.cn.luqingyun.web;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import org.xml.sax.SAXException;

import com.cn.luqingyun.common.WrapFreemarkerHttpServlet;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.BaseFont;

import freemarker.template.TemplateException;

/**
 * 注意这里继承的是WrapFreemarkerHttpServlet,该类除了具有HttpServlet的功能<br>
 * 还有初始化freemarker的功能
 * @author Tommy
 *
 */
public class PDFController extends WrapFreemarkerHttpServlet {

	private static final long serialVersionUID = 1L;

	public void init() throws ServletException {
		//初始化freemarker
		super.init();
	}

	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("application/pdf");

		try {
			// 1.freemarker处理

			// 创建数据模型
			Map root = new HashMap();
			root.put("user", "Flying Saucer介绍");
			root.put("text", "Flying Saucer is an XML/CSS renderer, which means it takes XML files as input, applies formatting and styling using CSS, and generates a rendered representation of that XML as output. The output may go to the screen (in a GUI), to an image, or to a PDF file. Because we believe most people will be interested in re-using their knowledge of web layout, our main target for content is XHTML 1.0 (strict), an XML document format that standardizes HTML.");

			// 指定模板文件,因为在web.xml中已经指定freemarker加载的文件夹 ,所以这里只需要指定文件名即可
			String templateFile = "pdfGenerate.ftl";

			// 输出到/WEB-INF/PDF/pdfFile.html
			String pdfFileUrl = getServletContext().getRealPath(
					"/WEB-INF/PDF/pdfFile.html");
			FileOutputStream fos = new FileOutputStream(new File(pdfFileUrl));
			Writer out = new OutputStreamWriter(fos, "UTF-8");

			// 将数据加载到模板文件
			process(templateFile, root, out);

			// 2.从freemarker产生的html文件生产PDF
			DocumentBuilder builder = DocumentBuilderFactory.newInstance()
					.newDocumentBuilder();
			InputStream is = new FileInputStream(new File(pdfFileUrl));
			Document doc = builder.parse(is);
			ITextRenderer renderer = new ITextRenderer();

			// 解决中文支持问题
			ITextFontResolver fontResolver = renderer.getFontResolver();
			fontResolver.addFont("fonts/simsun.ttc", BaseFont.IDENTITY_H,
					BaseFont.NOT_EMBEDDED);
			
			renderer.setDocument(doc, null);
			renderer.layout();
			OutputStream os = response.getOutputStream();
			renderer.createPDF(os);
			os.close();

		} catch (TemplateException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		}

	}

}

         

   这里的模板文件的文件也非常简单,代码如下: 

 

<html>
	<head>
		<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
		<title>flying sauser</title>
                <!--加这行代码的原因是,因为flyingSauser需要中文支持就必须要加,具体原因还不太清楚-->
		<style type="text/css">
			body {  
	         	font-family: SimSun;  
	     	}  
		</style>
	</head>
	<body>
		<h1>
			${user}
		</h1>
		<p style="text-indent: 2em;">
			${text}
		</p>
	</body>
</html>

 

     

    四、实现效果

     


 
 

   

     注意事项:编写模板的时候一定要有结束标签,例如<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>这一行代码不能写成<meta http-equiv="content-type" content="text/html; charset=UTF-8">否则会报The element type "meta" must be terminated by the matching end-tag "</meta>".

      需要完整项目的可以在评论区里面提供QQ号。很少写博客,有不足之处请多多之处,附件中提供了几个使用到的类,以及web.xml、simsun.ttc 以及pom.xml。

 

分享到:
评论

相关推荐

    maven+springmvc+spring+hibernate+freemarker

    maven管理项目+springmvc+spring+hibernate+freemarker 集成框架。其中注解格式清晰,hibernate进行了代码封装,对开发效率有了提高,对异常进行了封装。freemarker也有优化,参考common包下。对日期工具类有各种...

    Spring+Maven+freemarker+Ibatis项目

    总结,Spring+Maven+Freemarker+Ibatis的项目集成,提供了从项目构建、依赖管理、业务逻辑处理到视图展现的一整套解决方案,极大地提高了开发效率和项目质量。在实际开发中,开发者可以根据项目需求,灵活调整这四大...

    Maven+SpringMVC+Freemarker Demo

    这个"Maven+SpringMVC+Freemarker Demo"是一个基础的Web应用示例,它展示了如何将这三个强大的工具集成到一起,实现一个简洁高效的开发环境。 **1. Maven** Maven是Apache软件基金会开发的一个项目管理和综合工具,...

    JFinal+Maven+FreeMarker入门实例

    总结,`JFinal+Maven+FreeMarker`的组合为Java Web开发提供了一个高效、简洁的解决方案。JFinal的轻量级特性使得项目启动快速,Maven的依赖管理让项目构建变得简单,而FreeMarker则提供了灵活的视图渲染机制。通过这...

    基于SSM+maven+httpClient+jsoup实现小说网站项目.zip

    基于SSM+maven+httpClient+jsoup实现小说网站项目 基于SSM+maven+httpClient+jsoup实现小说网站项目 基于SSM+maven+httpClient+jsoup实现小说网站项目 基于SSM+maven+httpClient+jsoup实现小说网站项目 基于SSM+...

    基于SSM+maven+httpClient+jsoup实现小说网站项目源码.zip

    基于SSM+maven+httpClient+jsoup实现小说网站项目源码.zip 基于SSM+maven+httpClient+jsoup实现小说网站项目源码.zip 基于SSM+maven+httpClient+jsoup实现小说网站项目源码.zip 基于SSM+maven+httpClient+jsoup实现...

    手动创建 SpringMvc +SpringDataJpa+Hibernate+ freemarker mavenProject+ 环境切换 webDemo

    在本项目中,我们主要探讨如何手动构建一个基于SpringMVC、Spring Data JPA、Hibernate以及FreeMarker模板引擎的Maven工程,同时实现环境切换功能。这个基础框架为日常开发工作提供了必要的支持。 首先,SpringMVC...

    springmvc+mybatis+maven+freemarker+urlwrite+decorators

    【标题】"springmvc+mybatis+maven+freemarker+urlwrite+decorators"是一个集成的Web开发框架,用于构建高效、模块化且易于维护的Java应用。这个框架结合了Spring MVC、MyBatis、Maven、FreeMarker、UrlRewrite和...

    基于spring boot + maven + opencv 实现的图像深度学习Demo项目.zip

    基于spring boot + maven + opencv 实现的图像深度学习Demo项目,包含车牌识别、人脸识别、证件识别等功能,贯穿样本处理、模型训练、图像处理、对象检测、对象识别等技术点。 基于spring boot + maven + opencv ...

    maven+springmvc+mybatis+freemarker整合框架

    在“maven+springmvc+mybatis+freemarker”框架整合中,Maven负责管理项目依赖,确保所有组件正确无误地协同工作。 **SpringMVC** SpringMVC是Spring框架的一部分,用于构建Web应用的Model-View-Controller(MVC)...

    Java项目:课程信息管理系统(java+springboot+FreeMarker+maven+mysql)

    一、项目运行 环境配置: Jdk1.8 + Tomcat8.0 + mysql + Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持) ...Springboot + SpringMVC + MyBatis + FreeMarker + JavaScript + JQuery + Ajax + maven等等。

    idea+maven+tomcat实现登录案例源代码.zip

    标题中的"idea+maven+tomcat实现登录案例源代码"表明这是一个使用IntelliJ IDEA集成开发环境(IDE),Maven构建工具以及Tomcat服务器来实现的登录功能的示例项目。这个项目的主要目的是通过代码展示如何在Java Web...

    基于SSM + Maven + Bootstrap实现新闻网站系统,前后端分离.zip

    基于SSM + Maven + Bootstrap实现新闻网站系统,前后端分离 基于SSM + Maven + Bootstrap实现新闻网站系统,前后端分离 基于SSM + Maven + Bootstrap实现新闻网站系统,前后端分离 基于SSM + Maven + Bootstrap实现...

    Docker+Jenkins+GitLab+Maven+SpringBoot自动化构建.pdf

    Docker+Jenkins+GitLab+Maven+SpringBoot&SpringCloud;自动化构建

    java基于SpringBoot+freemarker实现的人事管理系统

    基于SpringBoot+freemarker实现的人事管理系统分为七大模块:绩效考核,招聘管理,档案管理,工资管理,考勤管理,培训管理,系统管理。本系统最大特色是有强大和灵活的权限控制功能,所有菜单,按钮功能均可由管理...

    Maven+SpringBoot+MyBatis+MySQL实现增删改查源码

    本教程将通过一个实际的项目案例,讲解如何使用Maven、SpringBoot、MyBatis和MySQL这四个关键技术来实现基本的数据增删改查(CURD)功能。下面我们将深入探讨这些技术及其在项目中的应用。 首先,Maven是一个项目...

    【ssm框架】 spring+springMVC+mySQL+myBatis+freemarker+Maven小示例1

    在实际应用中,开发者会根据业务需求,利用SSM框架提供的功能进行更复杂的配置和定制,例如添加拦截器、自定义拦截规则、实现分页功能、缓存机制等。本项目小示例则为初学者提供了一个学习SSM框架集成的起点。通过...

    SSM+Maven+Shiro

    SSM+Maven+Shiro 是一种常见的Java Web开发架构,由Spring、...总的来说,SSM+Maven+Shiro的整合提供了完整的Web应用开发解决方案,涵盖了从项目构建、业务处理到安全控制的全链条,是现代Java Web开发的主流选择之一。

Global site tag (gtag.js) - Google Analytics