一、引入依赖

        <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.28</version></dependency><dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf</artifactId><version>9.1.5</version></dependency>

二、创建Freemarker模板(test.ftl)

     <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><br/><title>测试</title></head><bodystyle="font-family:FangSong;" ><table border="1"><#list itemList as item><tr><th>${item.id}</th><th>${item.name}</th></tr></#list></table><img src="data:image/jpg;base64,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" alt="" width="120" height="120"/></body></html>

四、创建转换工具

package com.test.demo.pdf;import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.BaseFont;import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;/*** HTML转换成PDF文件* @Author LinCH**/
public class HtmlToPdfUtils {private static Logger LOG = LoggerFactory.getLogger(HtmlToPdfUtils.class);/*** 生成PDF文档字节流* @param template Freemarker模板* @param variables 参数* @param fontPaths 字体文件路径(文档中存在中文一定要设置一个支持中文的字体,且在这边必须将该字体的文件设置进来,否则中文无法显示)* @return PDF文档字节流* @throws IOException* @throws DocumentException* @throws TemplateException*/public static ByteArrayOutputStream generatePdfStream(String template, Map<String, Object> variables, String[] fontPaths) throws IOException, DocumentException, TemplateException {String htmlStr = generateHtmlStr(template, variables);LOG.debug(htmlStr);ITextRenderer renderer = new ITextRenderer();ITextFontResolver fontResolver = renderer.getFontResolver();for(String fontPath : fontPaths){fontResolver.addFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);}ByteArrayOutputStream os = new ByteArrayOutputStream();renderer.setDocumentFromString(htmlStr);renderer.layout();renderer.createPDF(os);return os;}/*** 使用Freemarker生成HTML文档* @param template Freemarker模板* @param variables 参数* @return 生成的HTML文档字符串* @throws IOException* @throws TemplateException*/public static String generateHtmlStr(String template, Map<String, Object> variables) throws IOException, TemplateException {Configuration config = new Configuration();config.setClassForTemplateLoading(FreemarkerUtils.class, "/");Template tp = config.getTemplate(template);StringWriter stringWriter = new StringWriter();BufferedWriter writer = new BufferedWriter(stringWriter);tp.setEncoding("UTF-8");tp.process(variables, writer);String htmlStr = stringWriter.toString();writer.flush();writer.close();return htmlStr;}}

四、生成并下载PDF文档

package com.test.demo.web.controller;import com.lowagie.text.DocumentException;
import com.test.demo.pdf.HtmlToPdfUtils;
import com.test.demo.pdf.Item;import freemarker.template.TemplateException;import org.springframework.core.io.ClassPathResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.servlet.http.HttpServletRequest;/**** @Author LinCH**/
@Controller
public class TestController {public final static String USER_AGENT = "USER-AGENT";public final static String MSIE = "MSIE";public final static String TRIDENT = "Trident";public final static String MOZILLA = "Mozilla";public final static String UTF8 = "UTF-8";public final static String ISO88591 = "ISO8859-1";@RequestMapping("/fun1")public ResponseEntity<byte[]> fun1(HttpServletRequest request) throws DocumentException, TemplateException, IOException {Map<String, Object> map = new HashMap<>();List<Item> itemList = new ArrayList<>();for (int i = 0; i < 100; i++) {itemList.add(new Item("id" + i, "张三aaaaaaaaa" + i));}map.put("itemList", itemList);ByteArrayOutputStream os = HtmlToPdfUtils.generatePdfStream("test.ftl",map, new String[]{new ClassPathResource("/simfang.ttf").getPath()});HttpHeaders headers = new HttpHeaders();String codedfilename = null;String agent = request.getHeader(USER_AGENT);// IEif (null != agent && -1 != agent.indexOf(MSIE) || null != agent && -1 != agent.indexOf(TRIDENT)) {String name = java.net.URLEncoder.encode("PDF测试.pdf", UTF8);codedfilename = name;} else if (null != agent && -1 != agent.indexOf(MOZILLA)) {codedfilename = new String("PDF测试.pdf".getBytes(UTF8), ISO88591);}headers.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + codedfilename + "\"");HttpStatus statusCode = HttpStatus.OK;ResponseEntity<byte[]> entity = new ResponseEntity<>(os.toByteArray(), headers, statusCode);return entity;}}

五、备注

 IText在2.17以后的版本开源协议为AGPL,商用时需谨慎,目前还是使用2.17版本。

Freemarker + flying-saucer-pdf 基于IText2.17实现HTML文档转换成PDF相关推荐

  1. WORD文档转换成PDF格式

    由于一个客户的项目中需要将WORD文档转换成PDF格式,实战教程如下: 需求分析:客户的项目以B/S结构为主,提供一个WORD文件在后台自动转换成PDF,经过实际 测试, 如果该篇WORD文档有100 ...

  2. word转图片 java_Java 利用LibreOffice将Office文档转换成 PDF,进而转图片,实现在线预览功能...

    项目中需要将 Office 文档上传并实现在线预览,用到了 LibreOffice 将 Office 文档转换为 PDF 文档,然后再用 pdfbox 将 PDF 转为图片. 本文介绍借助 Libre ...

  3. Office文档转换成PDF

    分享知识 传递快乐 Office文档转换成PDF 文档转换的方式有很多种,比如有Apache下的POI.jodconverter等技术.本例用的jodconverter-core-3.0技术对文档进行 ...

  4. 怎么把word文档转换成PDF?

    Word文件完成编辑之后,想要转发给他人,但是担心在转发过程中出现了格式错乱的情况,将word文档转换成PDF格式再转发就可以避免类似情况了.那么如何将word文档转换成PDF文件? 方法一: 在编辑 ...

  5. java将WORD文档转换成pdf文件

    总结对jacob和Itext学习总结.本文试验的是将WORD转换成PDF文件. 实现思路 一.先将WORD文档转换成HMTL文件格式(参阅我的前一文<JAVA操作WORD文档). 二.用流读取H ...

  6. doPDF虚拟打印机-把任何文档转换成pdf的利器

    doPDF是一个完全免费的软件,安装完成之后,它会化身为系统中的虚拟打印机.不管是什么格式的文档还是图片,只要能够被打印,就可以轻松被转换成pdf文档,从此扫描仪的使用频率会大大降低,除了节省之间之外 ...

  7. Office文档转换成PDF文档

    本方案是我在网络上收集前人智慧,以及辛苦奋斗探索几周完成的成果. 本文从一个只会Java零基础的开发者的角度,全面.琐碎的进行总结. 具体方案: 方案一.使用OpenOffice.org的系统服务+j ...

  8. python学习之word文档转换成pdf文档

    平时办公的时候总有word文档转换pdf的操作,关键wps等转换工具都还是收费的.这里利用python代码把多个word文档转换合并成pdf文档的实现.代码运行需要几个必要库,没有下载安装的小伙伴可以 ...

  9. 将word文档转换成pdf格式【使用Aspose技术实现:亲测可用】

    提示:Java使用Aspose技术将word文件转换成pdf文件 文章目录 一.介绍 二.下载依赖并引入jar包 三.编写功能 一.介绍 Java语言使用Aspose技术将word转换成pdf文件的功 ...

最新文章

  1. HBase安装与命令行操作
  2. VC++开发简易输电线路管理信息系统
  3. 前端微信签名验证工具_微信jssdk 签名错误排查方法
  4. ffmpeg-从mp4、flv、ts文件中提取264视频流数据
  5. Android 如何退出整个应用程序?
  6. 搭建Hexo博客(一)-创建Hexo环境
  7. 大家都在用这个神器分析数据,而你还只会Excel表头过滤?
  8. Strust2 + Hibernate load方法出现的错误
  9. SpringBoot文档翻译系列——26.日志logging
  10. 定时让电脑进入休眠状态
  11. OpenCC繁体文章转换成简体字
  12. 《Effective C#》读书笔记(4)
  13. 科大讯飞语音接口调用实现语音识别
  14. 互联网名词解释(通用、运营、广告、APP推广、移动推广、APP运营、商务模式、职位、客户管理)
  15. 洛谷题单-【算法1-5】贪心
  16. 一种依靠压缩电磁铁制造暗物质虫洞的机器
  17. Latex中如何插入参考文献的两种方法
  18. openjudge 1.9.8 白细胞计数
  19. H5(html5)入门教程
  20. windows启动时自动运行程序(登录或不登录都可以的)

热门文章

  1. GB/T 12504-90 计算机软件质量保证计划规范
  2. 走进探索人工智能的格灵深瞳
  3. 对2022年TI杯的记录
  4. 获取淘宝搜索商品列表数据
  5. 江苏省计算机二级c语言上机,2012春江苏省高校计算机等级考试二级C语言上机题(C01)及其解答_张柏雄...
  6. 共享的计算机用户账户限制,win10系统在局域网共享文件提示“登录失败:用户账户限制”的操作技巧...
  7. 【趣味数学】快速判断一个数是否是另一个数的倍数
  8. java万年历设计报告_JAVA《万年历系统》课程设计报告附源码.doc
  9. Spark宽依赖 窄依赖 Job Stage Executor Task 总结
  10. c语言-输出倒三角图案