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

来源:互联网 发布:什么装机软件好 编辑:程序博客网 时间:2024/04/28 03:47

在现实的项目中,客户提出来要把表格导出成为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 blocke.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();}}






0 0
原创粉丝点击