当前位置:   article > 正文

springboot实现PDF生成 --- 使用html文件转化为PDF文件,并且实现表格动态数据插入,中文不显示问题解决_springboot html转pdf

springboot html转pdf

使用maven依赖   使用Itext处理html文件的保真率很高,但是要注意,对html的写法一定要符合规范,如果有错误的话,就处理不成功,

还有一点踩的坑:

在进行文件动态生成的时候,使用<script> js代码进行表格动态插入使用document.write(),一直会报错,由此得知,Itext处理html生成PDF的时候,是不支持js语法文件的。
 

  1. <!--PDF-->
  2. <dependency>
  3. <groupId>org.eclipse.birt.runtime.3_7_1</groupId>
  4. <artifactId>com.lowagie.text</artifactId>
  5. <version>2.1.7</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.xhtmlrenderer</groupId>
  9. <artifactId>flying-saucer-pdf</artifactId>
  10. <version>9.1.18</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>com.itextpdf</groupId>
  14. <artifactId>itextpdf</artifactId>
  15. <version>5.4.2</version>
  16. </dependency>

 我的html核心代码如下

  1. <body class='typora-export os-windows' style="font-family: SimSun ">
  2. <div id='write' class='is-node'>
  3. <h3 style="text-align: center;"><a name="交易" class="md-header-anchor"></a><span>
  4. </span><strong><span style="text-align: center;">交易</span></strong></h3>
  5. <p><span> </span></p>
  6. <p><span> </span><strong><span style="margin-left: 210px">交易A方:{{name}}</span></strong></p>
  7. <p><span> </span></p>
  8. <p><span> </span><strong><span style="margin-left: 210px" >存证交易B方:{{party}}</span></strong></p>
  9. <p><span> </span></p>
  10. <p><span> </span></p>
  11. <p><span>本着公平公开公正的原则,就A,B双方的数据共享事宜,经友好协商,达成如下协议:</span></p>
  12. <p><span> </span></p>
  13. <p><span>A,B双方,数据共享,将进行数据存证,本合约约定存证数据如下</span></p>
  14. <p><span> </span></p>
  15. <p><span> </span></p>
  16. <figure>
  17. <table style="text-align: center">
  18. <thead>
  19. <tr>
  20. <th><span>序号</span></th>
  21. <th><span>数据类型</span></th>
  22. <th><span>数据名</span></th>
  23. </tr>
  24. </thead>
  25. <tbody>
  26. {{table}}
  27. </tbody>
  28. </table>
  29. </figure>
  30. <p><span> </span></p>
  31. <div style="display: flex; justify-content: space-between;">
  32. <strong>
  33. <span style="margin-left: 10px;">{{name}}</span>
  34. </strong>
  35. <strong>
  36. <div style="position: absolute; left: 420px;">
  37. <span>{{party}}</span>
  38. </div>
  39. </strong>
  40. </div>
  41. <!-- <p><span> </span><strong><span style="margin-left: 10px;">存证交易A方:{{name}}</span></strong><strong><span-->
  42. <!-- style="margin-left: 210px; position: absolute">存证交易B方:{{party}}</span></strong></p>-->
  43. </div>
  44. </body>

在html中,使用占位符进行位置的占用,因为是表单动态数据增加,不使用js的话,那就只能自己手动拼接table代码进行内容的替换,在下面java代码中有具体的演示操作。

  1. public void test12() {
  2. try {
  3. // 打开HTML文件
  4. File file = new File("D:\\workspace\\visualContractNegotiation\\visualContractNegotiationCore\\src\\main\\resources\\template\\user.html");
  5. FileReader fileReader = new FileReader(file);
  6. BufferedReader bufferedReader = new BufferedReader(fileReader);
  7. // 读取HTML内容并转换为字符串
  8. StringBuilder stringBuilder = new StringBuilder();
  9. String line;
  10. while ((line = bufferedReader.readLine()) != null) {
  11. stringBuilder.append(line);
  12. }
  13. String htmlString = stringBuilder.toString().replace("{{name}}","1212").replace("{{party}}","12121121212").replace("{{table}}", " <tr>\n" +
  14. " <td>1</td>\n" +
  15. " <td>2</td>\n" +
  16. " <td>3</td>\n" +
  17. " </tr>");
  18. // System.out.println(htmlString);
  19. ; // 要将内容中的特殊字符替换
  20. // 关闭文件读取器
  21. // 转换为pdf
  22. ITextRenderer renderer = new ITextRenderer();
  23. ITextFontResolver fontResolver = renderer.getFontResolver();
  24. OutputStream os = new FileOutputStream("output.pdf");
  25. renderer.setDocumentFromString(htmlString);
  26. fontResolver.addFont("src/main/resources/template/simkai.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
  27. fontResolver.addFont("src/main/resources/template/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
  28. fontResolver.addFont("src/main/resources/template/楷体.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
  29. fontResolver.addFont("src/main/resources/template/STZHONGS.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
  30. renderer.layout();
  31. renderer.createPDF(os);
  32. os.close();
  33. bufferedReader.close();
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. // html 中表单动态样式插入, 这是我的业务需要,你可以根据自己的需求进行参数的修改
  39. public static String generateTableHtml(Map<String, String> contents) {
  40. String params = contents.get("params");
  41. StringBuilder result = new StringBuilder();
  42. if (params == null || params.equals("")) {
  43. return "";
  44. } else {
  45. String[] split = params.split(",");
  46. int i = 1;
  47. for (String s : split) {
  48. String value = null;
  49. String[] split1 = s.split("-");
  50. if (split1.length == 2) {
  51. value = split1[1];
  52. }
  53. // result.append(split1[0]).append(split1[1]);
  54. // 核心处理
  55. result.append(" <tr>\n" + " <td>").append(i).append("</td>\n").append(" <td>").append(split1[0]).append("</td>\n").append(" <td>").append(value).append("</td>\n").append(" </tr>").append(" ");
  56. i++;
  57. }
  58. }
  59. return result.toString();
  60. }

 在进行pdf的生成的过程中,遇到的最大的问题就是中文不能显示,为此折腾了很久,网上也查找了很多,答案很杂,最后需要改动的主要有两块,

 前端html代码字体要 存在后端字体设置的字体中,不然中文一直显示不出来,设置完成后,基本就可以正常使用,能够生成pdf了

<body class='typora-export os-windows' style="font-family: SimSun ">
fontResolver.addFont("src/main/resources/template/simkai.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

pdf效果图(重要部分打码一下)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/684254
推荐阅读