java将html转为pdf

秒速五厘米 2023-02-28 01:52 123阅读 0赞

项目采用springboot,由于是后端导出pdf,所以用thymeleaf作为页面,后端请求页面,获取渲染后的html字符串,再导出为pdf

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>com.itextpdf</groupId>
  7. <artifactId>itextpdf</artifactId>
  8. <version>5.5.13</version>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.xhtmlrenderer</groupId>
  12. <artifactId>flying-saucer-pdf-itext5</artifactId>
  13. <version>9.0.3</version>
  14. </dependency>

逻辑代码

  1. String htmlUrl = "访问的页面";
  2. log.info("页面路径:{}", htmlUrl);
  3. String html = OkHttpUtil.sendGet(htmlUrl);
  4. String htmlContent = html.replace("<!DOCTYPE html>", "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">")
  5. .replace("<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">", "<html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">");
  6. log.info("html内容:\n{}", htmlContent);
  7. File pdf = FileUtil.createTempFile(id + ".pdf");
  8. HtmPdfUtil.html2pdf(htmlContent, pdf);

okhttp封装
注意,这里要将thymeleaf的部分标签替换为导出pdf支持的那种

thymeleaf标签

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">

生成pdf需要的标签

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">

要支持中文html中设置<body style="font-family: SimSun;">

导出pdf工具

  1. import com.itextpdf.text.pdf.BaseFont;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.core.io.ClassPathResource;
  4. import org.xhtmlrenderer.pdf.ITextFontResolver;
  5. import org.xhtmlrenderer.pdf.ITextRenderer;
  6. import java.io.File;
  7. import java.io.FileOutputStream;
  8. import java.io.OutputStream;
  9. @Slf4j
  10. public class HtmPdfUtil {
  11. /** * 将HTML转成PDF格式的文件。html文件的格式比较严格 * * @param htmlContent * @param pdfFile * @throws Exception */
  12. public static void html2pdf(String htmlContent, File pdfFile) throws Exception {
  13. OutputStream os = new FileOutputStream(pdfFile);
  14. ITextRenderer renderer = new ITextRenderer();
  15. renderer.setDocumentFromString(htmlContent);
  16. // 中文
  17. ITextFontResolver fontResolver = renderer.getFontResolver();
  18. ClassPathResource resource = new ClassPathResource("font/simsun.ttc");
  19. fontResolver.addFont(resource.getURL().toString(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
  20. renderer.layout();
  21. renderer.createPDF(os);
  22. os.close();
  23. }
  24. }

中文字体资源路径
在这里插入图片描述
tip:如果导出pdf中含有img标签,导出的图片发生了转换,是因为图片太大导致的,对图片进行压缩即可

图片压缩

在这里插入图片描述

在这里插入图片描述

参考文献

https://hacpai.com/article/1536549807193

发表评论

表情:
评论列表 (有 0 条评论,123人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java PDF转为线性PDF

    线性化PDF文件是PDF文件的一种特殊格式,可以通过Internet更快地进行查看。线性化的PDF,在页面数量很多的情况下,更能突出表现出快速浏览的优势。下面是通过后端Java

    相关 Java PDF转为OFD

    OFD格式一种国产文件格式,在一些对文档格式有着严格的企业中用得比较多。下面,通过Java程序展示如何将PDF文件转为OFD格式。 代码思路:加载PDF源文档,调用Spire

    相关 Java Html转为PDF(一)

    文介绍如何在Java程序中将html文件转换成PDF文件。转换时,需要注意以下两点: **一、需要使用转换插件** 可根据不同的系统来下载对应的插件,下载地址:[wi...