利用Freemarker、itext和Flying saucer导出复杂表格的PDF格式文档

在现实的项目中,客户提出来要把表格导出成为PDF格式的,但是利用传统的IText来做的话,对于简单的表格还是可以的,对于复杂表格来说就很困难了,在原来导出Word和Excel的经验基础上,想到可不可以利用freemarker模版技术来导出文档,于是网上搜索了很多资料研究了一下!!

 iText是一个生成PDF文档的开源java库,能够动态从XML或者数据库生成PDF,同时它具备PDF文档的绝大多数属性(比如加密……),支持java,C#等。

Flying Saucer(或者叫xhtmlrender project on java.net)是一个基于iText的开源java库,能够轻松的将html(带css2.1)生成pdf。

FreeMarker是一个模版引擎,一个基于文本的模板输出工具(生成任意的HTML表单代码)。

下面给一个链接,根据这个我写了一个基于response保存的例子:

http://git.oschina.net/lemonzone2010/doc-render


这是我action的例子:

/**
	 * 导出PDF
	 * @throws com.canglang.etc.pdf.freemarker.DocumentGeneratingException
	 */
	public void test() throws com.canglang.etc.pdf.freemarker.DocumentGeneratingException {
		long start = System.currentTimeMillis();
		//TableModel tableModel = (TableModel) tableModelService.getEntityByID(TableModel.class, tmId);
		// 模板数据
		com.canglang.etc.pdf.pdf.OverseaVo overseaVo = new com.canglang.etc.pdf.pdf.OverseaVo();
		//放置模板数据
		Map<String, Object> variables = new HashMap<String, Object>();
		if(name.equals("中心机房检查表")){
			checkHostRoom = (CheckHostRoom) checkHostRoomService.getEntityByID(CheckHostRoom.class, id);
			variables = checkHostRoom.fillDataMap();
		
			
		}
		HttpServletResponse response = getResponse();
		response.setContentType("application/pdf"); 
		response.setHeader("Pragma", "public");
		response.setHeader("Cache-Control", "max-age=30");
		try {
			response.setHeader("Content-disposition", "attachment; filename="+ new String(name.getBytes("gb2312"), "iso8859-1")+".pdf");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// classpath 中模板路径
		String savepath = UploadUtil.generateSaveRealPath("CheckModel");
		String template = savepath+name+".html";

		
		HtmlGenerator htmlGenerator = new HtmlGenerator();
		try {
			String htmlContent = htmlGenerator.generate(template,
					variables);
			DocumentBuilder builder = DocumentBuilderFactory.newInstance()
					.newDocumentBuilder();
			Document doc = builder.parse(new ByteArrayInputStream(htmlContent
					.getBytes("UTF-8")));
			
			ServletOutputStream out = response.getOutputStream();

			ITextRenderer iTextRenderer = (ITextRenderer) ITextRendererObjectFactory
					.getObjectPool().borrowObject();

			try {
				iTextRenderer.setDocument(doc, null);
				iTextRenderer.layout();
				iTextRenderer.createPDF(out);
			} catch (Exception e) {
				ITextRendererObjectFactory.getObjectPool().invalidateObject(
						iTextRenderer);
				iTextRenderer = null;
				throw e;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值