需求:将网页内容导出为pdf文件,其中包含文字,图片,echarts图
原理:利用freemarker模板与数据渲染所得到的html内容,通过ITextRenderer对象解析html内容生成pdf
参考地址:
导出pdf
带有图片

使用itext将html生成pdf中文换行问题解决方案

 
本文内容是参考以上地址内容对需求的实现
 
1.添加依赖
  1. <!-- freemarker -->
  2. <dependency>
  3. <groupId>org.freemarker</groupId>
  4. <artifactId>freemarker</artifactId>
  5. <version>2.3.19</version>
  6. </dependency>
  7. <!-- itextpdf,导出pdf核心架包 -->
  8. <dependency>
  9. <groupId>com.itextpdf</groupId>
  10. <artifactId>itextpdf</artifactId>
  11. <version>5.5.11</version>
  12. </dependency>
  13. <!-- itextpdf工具包,用来解析html生成pdf -->
  14. <dependency>
  15. <groupId>com.itextpdf.tool</groupId>
  16. <artifactId>xmlworker</artifactId>
  17. <version>5.5.11</version>
  18. </dependency>
  19. <!-- flying saucer,支持对CSS高级特性的解析 -->
  20. <dependency>
  21. <groupId>org.xhtmlrenderer</groupId>
  22. <artifactId>flying-saucer-pdf</artifactId>
  23. <version>9.1.5</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.xhtmlrenderer</groupId>
  27. <artifactId>flying-saucer-pdf-itext5</artifactId>
  28. <version>9.1.5</version>
  29. </dependency>
2.freemarker模板数据渲染html内容
  1. // 获设置模板路径,供参考
  2. static {
  3. freemarkerCfg =new Configuration();
  4. //freemarker的模板目录
  5. freemarkerCfg.setClassForTemplateLoading(JavaToPdfHtmlFreeMarker.class,"/");
  6. }
  7. public static String freeMarkerRender(Map<String, Object> data, String htmlTmp) {
  8. Writer out = new StringWriter();
  9. try {
  10. // 获取模板,并设置编码方式
  11. Template template = freemarkerCfg.getTemplate(htmlTmp);
  12. template.setEncoding("UTF-8");
  13. // 合并数据模型与模板
  14. template.process(data, out); //将合并后的数据和模板写入到流中,这里使用的字符流
  15. out.flush();
  16. return out.toString();
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. } finally {
  20. try {
  21. out.close();
  22. } catch (IOException ex) {
  23. ex.printStackTrace();
  24. }
  25. }
  26. return null;
  27. }
3.解析html内容生成pdf
  1. public static void createPdf(String content,OutputStream out) throws IOException, com.lowagie.text.DocumentException {
  2. ITextRenderer render = new ITextRenderer();
  3.  
  4. ITextFontResolver fontResolver = render.getFontResolver();
  5. fontResolver.addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
  6.  
  7. // 解析html生成pdf
  8. render.setDocumentFromString(content);
  9.  
  10. //解决图片相对路径的问题
  11. //render.getSharedContext().setBaseURL("");
  12. render.layout();
  13. render.createPDF(out);
  14. render.finishPDF();
  15. }
OutputStream out可以换作其他输出流对象,比如new FileOutputStream("D:/a.pdf")
注意:设置字体后,需在CSS文件中也设置该字体,才可以显示中文
图片可以使用CSS设置背景图片为base64码格式展示
  1. body{
  2. font-family:SimSun;
  3. }
上面内容为网页下载pdf所调用,调用方法如下(供参考):
  1. try{
  2. OutputStream out = null;
  3. out = response.getOutputStream();
  4. //设置响应对象上下文类型
  5. response.setContentType( "application/pdf,charset=utf-8");
  6. //文件名处理,防止乱码问题
  7. fileName += DateTimeUtils.currentDate("yyMMddHHmmss") + ".pdf";
  8.  
  9. String filename = "";
  10. filename = request==null? java.net.URLEncoder.encode(fileName, "UTF-8"): AppUtils.encodingFileName(fileName,request);
  11. //设置响应头
  12. response.setHeader("Content-Disposition","attachment;filename=" + filename);
  13.  
  14. JavaToPdfHtmlFreeMarker.createPdf(content,out);
  15.  
  16. //获取响应对象输出流并返回
  17. if (out != null) {
  18. out.close();
  19. out = null;
  20. }
  21. } catch (UnsupportedEncodingException e) {
  22. e.printStackTrace();
  23. return super.outJsonStringFail();
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. return super.outJsonStringFail();
  27. } catch (com.lowagie.text.DocumentException e) {
  28. e.printStackTrace();
  29. return super.outJsonStringFail();
  30. }

4.如有echarts图,可添加一下js,将图转为base64码放于css或者html中的style属性中

  1. /**
  2. * 将多个canvas画布组成的图表合成为一个完整的canvas,并获取完整的dataURl
  3. * @param divId divId 包含整个画布的divId
  4. * @returns {String} widthXheight@dataURL 例:
  5. * 400X300@data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA
  6. */
  7.  
  8. function getFullCanvasDataURL(divId){
  9. //将第一个画布作为基准。
  10. var baseCanvas = $("#"+divId).find("canvas").first()[0];
  11. if(!baseCanvas){
  12. return false;
  13. };
  14. var width = baseCanvas.width;
  15. var height = baseCanvas.height;
  16. var ctx = baseCanvas.getContext("2d");
  17. //遍历,将后续的画布添加到在第一个上
  18. $("#"+divId).find("canvas").each(function(i,canvasObj){
  19. if(i>0){
  20. var canvasTmp = $(canvasObj)[0];
  21. ctx.drawImage(canvasTmp,0,0,width,height);
  22. }
  23. });
  24. //获取base64位的url
  25. return baseCanvas.toDataURL();
  26. }

java通过freemarker模板导出pdf的更多相关文章

  1. java使用freemarker模板导出word(带有合并单元格)文档

    来自:https://blog.csdn.net/qq_33195578/article/details/73790283 前言:最近要做一个导出word功能,其实网上有很多的例子,但是我需要的是合并 ...

  2. java根据模板导出PDF(利用itext)

    一.制作模板     1.下载Adobe Acrobat 9 Pro软件(pdf编辑器),制作模板必须使用该工具. 2.下载itextpdf-5.5.5.jar.itext-asian-5.2.0.j ...

  3. Java 用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  4. java根据模板导出PDF详细教程

    原文:https://blog.csdn.net/pengyufight/article/details/75305128 题记:由于业务的需要,需要根据模板定制pdf文档,经测试根据模板导出word ...

  5. java根据模板导出pdf

    在网上看了一些Java生成pdf文件的,写的有点乱,有的不支持写入中文字体,有的不支持模板,有的只是随便把数据放里面生成文件,完全不考虑数据怎样放置的以及以后的维护性,想想还是自己总结一个完全版的导出 ...

  6. java模板导出PDF

    本次完善综合特点: 一对一,点对点的给对应的地方写值,比如模板里面放了个name标识,在程序里把“张三”赋给name,那么输出的pdf里面name的地方就变成了张三,准确方便快捷 支持中文,可以使用自 ...

  7. Java根据Freemarker模板生成Word文件

    1.  准备模板 模板 + 数据 = 模型 1.将准备好的Word模板文件另存为.xml文件(PS:建议使用WPS来创建Word文件,不建议用Office) 2.将.xml文件重命名为.ftl文件 3 ...

  8. java实现excel模板导出

    一. 准备工作 1. 点击此下载相关开发工具 2. 将poi-3.8.jxls-core-1.0两个jar包放到工程中,并引用 3. 将excel模板runRecord.xls放到RunRecordB ...

  9. 结合模板导出PDF文件

    @Action("report_exportJasperPdf")    public String exportJasperPdf() throws Exception{     ...

随机推荐

  1. PMC亮相IDF展示12G SAS分层存储解决方式

    引领大数据连接.传送以及存储,提供创新半导体及软件解决方式的PMC公司(纳斯达克代码:PMCS)出席了2014年4月2-3日在深圳举办的2014 IDF英特尔开发人员论坛. 此次,PMC将在 1层展示 ...

  2. css3制作动画性能问题

    这篇文章主要讲的是怎样制作流畅动画,特别是针对移动端.在这里我首先介绍制作动画的几种方法的优缺点:接着会着重介绍用css3制作动画的注意事项. 1.用canvas.css3.jquery制作动画 Ca ...

  3. Redis源码解析:04字典的遍历dictScan

    dict.c中的dictScan函数,用来遍历字典,迭代其中的每个元素.该函数使用的算法非常精妙!!!所以必须记录一下. 遍历一个稳定的字典,当然不是什么难事,但Redis中的字典因为有rehash的 ...

  4. top-100-of-the-best-useful-opensource-applications/

    top-100-of-the-best-useful-opensource-applications/ http://www.ubuntulinuxhelp.com/top-100-of-the-be ...

  5. hdu 1535 Invitation Cards(spfa)

    Invitation Cards Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  6. H3C MAC地址

  7. hdu 1016 Prime Ring Problem(dfs)

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  8. Treap(树堆)入门

    作者:zifeiy 标签:Treap 首先,我么要知道:Treap=Tree+Heap. 这里: Tree指的是二叉排序树: Heap指的是堆. 所以在阅读这篇文章之前需要大家对 二叉查找树 和 堆( ...

  9. Beta版是什么意思

    外部测试版的意思. 软件会出现三种版本 1.alpha内部测试版本,极不稳定,一般也不会出现的公众视线,仅供内部测试人员测试用. 2.beta公共测试版,就是对外发布软件的测试版,收集公众的意见和建议 ...

  10. 解决vscode电脑卡顿问题

    在安装了vscode之后,发现电脑很卡,cpu使用率高达100%. 解决方法1: 打开vscode之后,点击文件==>首选项==>设置搜索设置search.followSymlinks然后 ...