最近项目中遇到要用html生成pdf文件的需求,一开始研究了下前端插件jspdf,使用h5 canvas绘图生成图片,再把图片生成pdf文件,遇到了各种各样的问题,生成的pdf文件达到20多M,height超过5000浏览器就崩溃,有兴趣的童鞋可以尝试一下,该方案LZ最终放弃了。
接着开始尝试服务端生成,使用freemaker模板生成静态html文件,通过iext生成pdf,网上很多关于renderer.setDocument(dom,null)的用法,LZ尝试后发现效率奇低,最后放弃了,直接使用renderer.setDocumentFromString方法,要注意以下几点:
1、生成的html声明文件,xhtml部分要干掉,否则解析报错。
2、注意设置相对目录,一定要物理绝对目录,否者css和img文件就找不到了。
3、生成pdf时中文的问题,就是要加载字体文件simsun.ttc,这个网上解决方案不少,不做赘述,注意html加上样式。
<style> body{ font-family: SimSun; } </style>
public void exportPDF() throws Exception { OutputStream os = null; String htmlStr; Map<String, Object> params = new HashMap<String, Object>(); Map data = new HashMap(); try { /** xxx数据生成逻辑 **/ data.put("projects",xxx); //通过freemaker模板生成html htmlStr = HtmlGenerator.generate("pdf.ftl", data); String appPath = getReq().getSession().getServletContext().getRealPath("/") + File.separator; ITextRenderer renderer = new ITextRenderer(); renderer.setDocumentFromString(htmlStr,"file:" + appPath); // 解决中文支持问题 ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont(appPath + "template" + File.separator +"simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); //生成pdf文件 getRes().setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("测试", "UTF-8") + new Date().getTime() + ".pdf"); getRes().setContentType("application/pdf"); os = getRes().getOutputStream(); renderer.layout(); renderer.createPDF(os, true); os.flush(); } catch (Exception e) { e.printStackTrace(); }finally { if (null != os) { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } }
HtmlGenerator类,编码设置UTF-8,设置正确,不然有中文乱码问题。
package com.haziwang.rkhy.util; import java.io.BufferedWriter; import java.io.StringWriter; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.Template; public class HtmlGenerator { /** * @param template * @param variables * @return * @throws Exception */ public static String generate(String template, Map params) throws Exception{ Configuration config = FreemarkerConfiguration.getConfiguation(); config.setDefaultEncoding("UTF-8"); Template tp = config.getTemplate(template); StringWriter stringWriter = new StringWriter(); BufferedWriter writer = new BufferedWriter(stringWriter); tp.setEncoding("UTF-8"); tp.process(params, writer); String htmlStr = stringWriter.toString(); writer.flush(); writer.close(); return htmlStr; } }
FreemarkerConfiguration类,设置ftl文件目录,相对于classes目录设置
package com.haziwang.rkhy.util; import freemarker.template.Configuration; public class FreemarkerConfiguration { private static Configuration config = null; /** * Static initialization. * * Initialize the configuration of Freemarker. */ static{ config = new Configuration(); config.setClassForTemplateLoading(FreemarkerConfiguration.class, "/../../template/"); config.setTemplateUpdateDelay(0); } public static Configuration getConfiguation(){ return config; } }
代码目录结构
maven引入jar包
<dependency> <artifactId> flying-saucer-pdf-itext5 </artifactId> <groupId> org.xhtmlrenderer </groupId> <version> 9.0.6 </version> </dependency> <dependency> <artifactId> freemarker </artifactId> <groupId> freemarker </groupId> <version> 2.3.8 </version> </dependency>
相关推荐
这篇博客 "freemarker+itext生成PDF" 可能详细介绍了如何结合这两者来生成PDF文件,这在报表生成、发票打印或任何需要静态化输出的场景中非常有用。 首先,让我们了解FreeMarker。FreeMarker是一个基于模板的语言,...
`Freemarker`是一个强大的模板引擎,通常用于动态生成HTML、XML等文本格式,而将`Freemarker`与HTML模板结合生成PDF,可以充分利用HTML的易编辑性和富文本特性,为用户提供高质量的文档输出。下面我们将深入探讨如何...
在IT领域,生成PDF文档是常见的需求,尤其在报表、合同和文档自动化中。本教程将探讨如何使用iText7和FreeMarker库结合,来创建一个基于模板的PDF生成流程,确保中文支持和图片的正常显示。 首先,iText7是一款强大...
然后,创建一个 PdfUtils 工具类,用于生成PDF文档。 四、PDF工具类编写 PdfUtils工具类主要用于生成PDF文档。该类中包含了生成HTML模板、将HTML模板转换为PDF文档的方法。方法上有完整的注释,思路是利用模板引擎...
搜索了好多篇例子,算是强拼硬凑成现在的...此包中包含可测试成功代码,关联模板、字体文件、jar等 希望能帮助到大家。 这篇文章的作者蛮厉害,有不少借鉴。 http://blog.csdn.net/layman1024/article/details/74628658
总结一下,要实现在Spring Boot应用中使用iText生成带有页眉、页码、水印、目录和二维码的PDF,你需要: 1. 引入iText及相关库。 2. 创建HTML页面并将其转换为PDF。 3. 定制PDF内容,包括添加页眉、页码和水印。 4. ...
对于没有使用宏、函数等word、excel,需要按模板动态生成word、excel、html,只需要一个freemarker,先将word、excel、html等另存为**xml**,即可使用模板动态生成文件,目前xlsx是不支持的 4. PdfTemplate 对于不会...
java根据动态模板生成pdf(包含柱状图)所需jar包 iText+FreeMarker+JFreeChart生成可动态配置的PDF文档。 iText有很强大的PDF处理能力,但是样式和排版不好控制,直接写PDF文档,数据的动态渲染很麻烦。 FreeMarker...
总结起来,“freemark+itext”方案提供了一种灵活且强大的方式来生成PDF文档。FreeMarker允许我们使用模板语言来描述文档的结构,而iText则负责将这些结构转换为PDF格式。这种组合使得开发人员能够快速地根据业务...
在Java开发中,生成PDF文件是一项常见的需求,特别是在企业级应用中,如生成合同、报告等文档。FreeMarker是一个强大的模板引擎,常用于生成HTML、XML等动态内容,但也可以结合其他库来生成PDF。本篇文章将深入探讨...
iText支持动态生成PDF,包括添加文本、图像、表格、超链接、水印等元素。在处理复杂的PDF生成需求时,iText通常是一个可靠的选择。它不仅适用于Java环境,还有.NET平台的版本。 其次,我们要提到的是Freemarker。...
5. 使用iTextPdf生成PDF:将渲染后的HTML转换为PDF,可以利用iTextPdf提供的`Document`、`PdfWriter`、`HtmlConverter`等类完成这个过程。 6. 提供下载接口:在控制器层创建一个HTTP接口,当用户访问这个接口时,...
本篇文章将深入探讨如何利用Freemarker来解析并生成PDF文件。 首先,理解Freemarker的基本概念至关重要。Freemarker是一个基于模板的、与语言无关的模板引擎,它的主要工作是将数据模型和模板结合,生成最终的输出...
总的来说,利用EOS和Freemarker生成PDF文件是一项实用的技术,它结合了模板引擎的灵活性和PDF格式的专业性,使得动态内容的输出变得简单高效。在实际开发中,根据项目需求选择合适的工具和技术栈,能有效提升开发...
在实际应用中,这些JAR文件通常会组合使用,首先,JFinal可能用于处理Web请求和数据库交互,获取需要生成PDF的HTML内容;接着,FreeMarker处理HTML模板并填充数据;然后,XMLWorker将处理后的HTML转化为iText可以...
本教程主要探讨如何利用HTML模板和iTextPDF库来创建PDF文件,同时也会提及Apache POI和Freemarker在导出Excel方面的应用,以及如何在PDF上添加文字水印。 首先,iTextPDF是一个强大的Java库,专门用于生成和修改PDF...
然后,将这些数据模型与模板结合,通过Freemarker的API生成PDF文档。 2. **插入电子签名**: 生成PDF后,我们需要找到合适的签名位置。这通常可以通过PDF坐标系统来实现,可以是预设的固定位置,也可以根据文档...
在“iText+Flying Saucer生成pdf文档jar包(修改后的)”这个描述中,"修改后的"可能指的是开发者对原始库进行了一些定制,以更好地支持中文显示。这可能包括修改字体设置、编码处理或者解决了某些特定的中文排版...
本示例将深入讲解如何利用iText库来导出PDF文件,以满足特定的需求。 首先,确保已将iText库添加到项目依赖中。通常,可以通过Maven或Gradle来引入。对于Maven项目,可以在pom.xml文件中添加以下依赖: ```xml ...
Freemarker是一款强大的Java...总结,使用Freemarker导出Word和PDF文档是一种常见的技术手段,结合合适的库和精心设计的工具类,可以高效地实现动态文档生成。理解这些知识点对于提升开发效率和产品质量具有重要意义。