工作中通常 有java 生成 PDF 的需求,本篇博客为java开发者提供参考方案

主要通过 html + thymeleaf(或其他模板引擎都可) + itextpdf 的方式 生成pdf

HTML 只能是纯html + css,能够支持svg标签,不支持js

前置条件 : 会写html(不会就让前端给) + 能够使用thymeleaf(或者使用其他模板,比较简单)+pdf中文支持插件 simsun.ttf

POM 依赖

      <!-- https://mvnrepository.com/artifact/com.itextpdf/html2pdf --><dependency><groupId>com.itextpdf</groupId><artifactId>html2pdf</artifactId><version>4.0.4</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>ognl</groupId><artifactId>ognl</artifactId><version>${ognl.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.1</version></dependency>

pdf生成流程 : 读取 thymeleaf+html 的模板  -> thymeleaf 解析html模板为String - > html2pdf 转换html为pdf

代码实现

package com.jianan.qns.ams.batch.utils;import com.jianan.tms.common.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;/*** jzc*/
@Slf4j
public class ThymeleafUtil {public static TemplateEngine templateEngine = new TemplateEngine();/*** 获取一份html 字符串* 其他模板生成html(jsp, FreeMarker..) 或者 html不需要额外处理,可以自行实现* @param absolutePath  resources下html的相对路径 eg: /template/index.html* @param params        html模板中需要的参数 具体请见 spring thymeleaf 文档* Map<String, Object> params = new HashMap();* params.put("batchNo","PC202212083894");* <td colspan="6" th:text="${batchNo}">PC202212083894</td>*                       * @return*/public static String getHtmlString(String absolutePath, Map<String, Object> params) {try {InputStream fileInputSteam = ThymeleafUtil.class.getResourceAsStream(absolutePath);log.info("开始是读取html文件");Context context = new Context();context.setVariables(params);return templateEngine.process(getFileString(fileInputSteam), context);} catch (Exception e) {log.error("html文件生成失败:cause--->" + e.getMessage());throw new RuntimeException("html模板读取失败");}}public static String getFileString(InputStream fileInputSteam) {try {return IOUtils.toString(fileInputSteam, "UTF-8");} catch (IOException e) {log.error("读取stream 字符失败 {}",e);throw new ServiceException("读取stream 字符失败");}}}
/*** jzc*/
@Slf4j
public class ITextHtmlPdfUtil {/*** 分析报告的html*/public static final String ANALYSE_HTML = "/template/index.html";/*** 中文支持插件在resource下的位置*/public static final String FONT = "/template/simsun.ttf";/*** PDF扩展名*/public static final String PDF_EXTENSION = ".pdf";public static final String ANALYSE_REPORT = "前缀";/*** pdf html 的路径*/public static final String TEMPLATE_PATH = "/template";public static byte[] createPdf(String htmlString) throws IOException {PageSize pageSize = new PageSize(1200, 2000);return createPdf(TEMPLATE_PATH, htmlString, pageSize);}// html 转 pdf 并返回字节数组public static byte[] createPdf(String resourceTemplateUri, String html, PageSize pageSize) throws IOException {//设置pdf的尺寸ByteArrayOutputStream outputStream = null;InputStream fontInputStream = null;try {outputStream = new ByteArrayOutputStream();PdfWriter writer = new PdfWriter(outputStream);PdfDocument pdf = new PdfDocument(writer);pdf.setTagged();pdf.setDefaultPageSize(pageSize);ConverterProperties properties = new ConverterProperties();//pdf宽高properties.setBaseUri(resourceTemplateUri);MediaDeviceDescription mediaDeviceDescription = new MediaDeviceDescription(MediaType.SCREEN);mediaDeviceDescription.setWidth(pageSize.getWidth());properties.setMediaDeviceDescription(mediaDeviceDescription);//中文支持FontProvider fontProvider = new DefaultFontProvider();fontInputStream = ITextHtmlPdfUtil.class.getResourceAsStream(FONT);FontProgram fontProgram = FontProgramFactory.createFont(IOUtils.toByteArray(fontInputStream));fontProvider.addFont(fontProgram);properties.setFontProvider(fontProvider);InputStream inputStreamRoute = new ByteArrayInputStream(html.getBytes());HtmlConverter.convertToPdf(inputStreamRoute, pdf, properties);return outputStream.toByteArray();} finally {IOUtils.closeQuietly(outputStream);IOUtils.closeQuietly(fontInputStream);}}
}
    public static void main(String[] args) throws IOException {Map<String, Object> params = new HashMap();params.put("batchNo", "PC202212083894");String html = ThymeleafUtil.getHtmlString("/template/index.html", params);byte[] bytes = createPdf(html);BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("/Users/xxx/Desktop/123.pdf"));bos.write(bytes);bos.close();log.info("生成pdf 结束");}

效果图

simsun.ttf 插件:  中文支持插件下载  (我自己的链接,失效了请百度下载,只支持linux服务器,windows需要自行解决)

JAVA 生成PDF (thymeleaf,html,itext,pdf)相关推荐

  1. itext html转pdf尺寸设置,如何设置PDF页面尺寸A4,当我们使用ITextRenderer生成从thymeleaf HTML模板PDF?...

    如何设置PDF页面尺寸A4,当我们使用ITextRenderer生成从thymeleaf HTML模板PDF? 我已经生成的PDF,但页面大小是不正确的,如何在JAVA设置页面大小A4 ITextRe ...

  2. java 生成纯色图片_Java 给PDF文档设置背景色(纯色、背景图片)

    import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase; import java.awt.*; public class ...

  3. # Itext Pdf 5 教程

    Itext Pdf 5 教程 Itext Pdf Itext7收费,故使用Itext5传统版,Itext5不再维护 官网:iText 5 |iText PDF Itext5 Java Api 地址:i ...

  4. java 生成pdf itext_使用Java组件itext 生成pdf介绍

    iText是一个能够快速产生PDF文件的Java类库.iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的.它的类库尤其与java Servlet有很好的给合.使用iText与 ...

  5. java itext 导出pdf文件_【Java,PDF】使用Itext实现PDF文件生成

    重要声明:本文章仅仅代表了作者个人对此观点的理解和表述.读者请查阅时持自己的意见进行讨论. 前言 有时候,业务系统要求提供一个PDF文件导出的功能,这时候我们就需要将数据库的对应数据查询出来,然后生成 ...

  6. java生成pdf加密_java使用iText 生成PDF全攻略(表格,加密)

    java使用iText 生成PDF全攻略,包括创建文档,设置字体,添加表格(PdfPTable),创建新页(newPage),设置布局,加密 主要使用的jar包: itextpdf-5.4.2.jar ...

  7. [itext] java生成pdf

    iText简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转 ...

  8. Java生成PDF文件(Itext篇)

    在企业的信息系统中,报表处理一直占比较重要的作用,iText是一种生成PDF报表的Java组件.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超链接显示或下载得到生成的报表,这样 ...

  9. Java生成PDF文档 iText使用PDF模板一

    最近在弄这个java生成pdf,哎,在网上查找了各种各样的学习资料,弄了几天,今天终于把这个效果简单的弄出来,所以,也把这个,我所走过的坑,作一个记录,提供接下来需要学习的人. 参考文献文档:http ...

最新文章

  1. Ruby中对象数组排序
  2. 【Python】疫情卷土重来?Python可视化带你追踪疫情的最新动态
  3. 从贝泰妮的全域消费者运营,看Quick Audience如何链接产品服务商生态
  4. 应用优化前心路历程~
  5. Linux源代码组织架构
  6. SploitFun Linux x86 Exploit 开发系列教程
  7. 第2章[2.6] 组件与容器的选择与开发
  8. VirtualBox启动失败,The VM session was aborted.
  9. c语言编写个人收支管理系统,个人收支管理系统
  10. 吕书健 我考H3CIE的经历
  11. [转载]世界各个地区WIFI 2.4G及5G信道划分表(附无线通信频率分配表)
  12. Keystore was tampered with, or password was incorr
  13. Win10 x64 安装Eplan P8 2.7 小结
  14. 简单的猜数字游戏[1]
  15. windows家族介绍
  16. [轻笔记]Pytorch语义分割输出转换为图像显示
  17. 基于VTK的PACS系统的开发 心路历程2
  18. 幕布,为知笔记和Effie哪个更适合采编呢?
  19. docker的privileged 与 k8s的privileged 设置方式
  20. 软考之运筹学-伏格尔计算方法

热门文章

  1. 2021年,不懂这1条赚钱法则的人都亏大了!
  2. 神经网络如何对图片进行识别,神经网络生成图片
  3. eBay运营思路(1)
  4. wps文本中表格表头重复_WPS表格设置打印表头让打印的每一页都显示相同的表头标题...
  5. 【入门软件测试01-抖音项目】
  6. Linux read only 檔案,動手玩Windows 10 Docker(4) - 有關Docker的儲存空間和檔案系統
  7. 人工智能入行攻略:数据缺陷挖掘与可解释分析(附百度高工直播讲解与动手实践)...
  8. 现在转行计算机如49年入国军?
  9. JAVA基于CompletableFuture的流水线并行处理深度实践
  10. MinGW/GCC/CodeBlocks 等在 Win7 编译出现 Permission Denied 错误 - 解决方法