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