flying saucer 使用中的一些问题 (java导出pdf)
flying saucer(源代码托管在github https://github.com/flyingsaucerproject/flyingsaucer)是java导出pdf的一种解决方案,最早是从downpour老大的文章里看到它: http://www.iteye.com/topic/509417 ,感觉比之前的iText好用许多,它可以解析css,即我将页面先设置好,然后传递给它,它既可以给我生成一个pdf出来,跟页面一样,当时感觉很酷,于是就研究了一下,现在项目中也用到了,效果还不错。
优点很明显,之前也提到了,可以解析css,这样很方便,大大的减少了工作量。pdf加水印也变得很简单——只需为body设置一个background-image即可。
说说使用中需要注意的一些问题吧:
[list=1]
中文换行问题
老外做的东西,没有考虑到中文问题。默认提供的包里,中文不会换行,有人修改了源代码,解决了这个问题,重新编译好的包在附件里,可以下载。需要注意的是,在官网提供的jar包里,有两个包,一个是core-renderer.jar,另一个是core-renderer-minimal.jar。引用时,只需引用前者就行。有人曾经说用这个重新编译后的包替换了原来的包之后,不起作用,原因就在此。
另外,想要中文换行,如果是table,那么table 的style必须加上这句话
style="table-layout:fixed; word-break:break-strict;"
<link href="file:///D|/project/WebContent/commons/css/module-pdf.css" rel="stylesheet" type="text/css" />
// 解决中文支持问题 ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont("C:/Windows/Fonts/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
<body style="font-family:'Arial Unicode MS'">
<td colspan="2""2">
@RequestMapping("/pdf/{projectId}")public ModelAndView generatePdf(HttpServletRequest request,HttpServletResponse response, @PathVariableString projectId) {Project project = this.projectService.getProjectById(projectId);ModelAndView mav = new ModelAndView();if (project == null) {mav.setViewName("forward:/error/page-not-found");return mav;} //中文需转义String pdfName = "pdfName";response.setHeader("Content-disposition", "attachment;filename="+pdfName;response.setContentType("application/pdf");OutputStream os = response.getOutputStream();ITextRenderer renderer = new ITextRenderer();//指定模板地址renderer.setDocument("http://localhost/project/preview/"+projectId);ITextFontResolver fontResolver = renderer.getFontResolver();if (StringUtils.isOSWindow())fontResolver.addFont("C:/Windows/Fonts/ARIALUNI.TTF",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);elsefontResolver.addFont("/usr/share/fonts/TTF/ARIALUNI.TTF",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);renderer.layout();renderer.createPDF(os);os.close();return null;} @RequestMapping("/preview/{projectId}")public ModelAndView pdf(@PathVariableString projectId) {Project project = this.projectService.getProjectById(projectId);ModelAndView mav = new ModelAndView();if (project == null) {mav.setViewName("forward:/error/page-not-found");return mav;}mav.setViewName("pdf");mav.addObject("project",project);return mav;}
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>title</title><link href="file:///D|/project/WebContent/commons/css/print-pdf.css" rel="stylesheet" type="text/css" /></head><body style="font-family:'Arial Unicode MS'"> <table border="1" cellspacing="0" cellpadding="0" style="table-layout:fixed; word-break:break-strict;"> <tr> <td rowspan="9" width="4%" style="width:160px">(1)项目单位名称 </td> <td colspan="2"><%=StringUtils.getValueString(user.getDeptName()) %></td> </tr> </table></body>