赞
踩
使用maven依赖 使用Itext处理html文件的保真率很高,但是要注意,对html的写法一定要符合规范,如果有错误的话,就处理不成功,
还有一点踩的坑:
在进行文件动态生成的时候,使用<script> js代码进行表格动态插入使用document.write(),一直会报错,由此得知,Itext处理html生成PDF的时候,是不支持js语法文件的。
- <!--PDF-->
- <dependency>
- <groupId>org.eclipse.birt.runtime.3_7_1</groupId>
- <artifactId>com.lowagie.text</artifactId>
- <version>2.1.7</version>
- </dependency>
- <dependency>
- <groupId>org.xhtmlrenderer</groupId>
- <artifactId>flying-saucer-pdf</artifactId>
- <version>9.1.18</version>
- </dependency>
- <dependency>
- <groupId>com.itextpdf</groupId>
- <artifactId>itextpdf</artifactId>
- <version>5.4.2</version>
- </dependency>
我的html核心代码如下
- <body class='typora-export os-windows' style="font-family: SimSun ">
- <div id='write' class='is-node'>
- <h3 style="text-align: center;"><a name="交易" class="md-header-anchor"></a><span>
- </span><strong><span style="text-align: center;">交易</span></strong></h3>
- <p><span> </span></p>
- <p><span> </span><strong><span style="margin-left: 210px">交易A方:{{name}}</span></strong></p>
- <p><span> </span></p>
- <p><span> </span><strong><span style="margin-left: 210px" >存证交易B方:{{party}}</span></strong></p>
- <p><span> </span></p>
- <p><span> </span></p>
- <p><span>本着公平公开公正的原则,就A,B双方的数据共享事宜,经友好协商,达成如下协议:</span></p>
- <p><span> </span></p>
- <p><span>A,B双方,数据共享,将进行数据存证,本合约约定存证数据如下</span></p>
- <p><span> </span></p>
- <p><span> </span></p>
- <figure>
- <table style="text-align: center">
- <thead>
- <tr>
- <th><span>序号</span></th>
- <th><span>数据类型</span></th>
- <th><span>数据名</span></th>
- </tr>
- </thead>
- <tbody>
- {{table}}
- </tbody>
- </table>
- </figure>
- <p><span> </span></p>
- <div style="display: flex; justify-content: space-between;">
- <strong>
- <span style="margin-left: 10px;">{{name}}</span>
- </strong>
- <strong>
- <div style="position: absolute; left: 420px;">
- <span>{{party}}</span>
- </div>
- </strong>
- </div>
-
-
- <!-- <p><span> </span><strong><span style="margin-left: 10px;">存证交易A方:{{name}}</span></strong><strong><span-->
- <!-- style="margin-left: 210px; position: absolute">存证交易B方:{{party}}</span></strong></p>-->
- </div>
- </body>
在html中,使用占位符进行位置的占用,因为是表单动态数据增加,不使用js的话,那就只能自己手动拼接table代码进行内容的替换,在下面java代码中有具体的演示操作。
- public void test12() {
- try {
- // 打开HTML文件
- File file = new File("D:\\workspace\\visualContractNegotiation\\visualContractNegotiationCore\\src\\main\\resources\\template\\user.html");
- FileReader fileReader = new FileReader(file);
- BufferedReader bufferedReader = new BufferedReader(fileReader);
-
- // 读取HTML内容并转换为字符串
- StringBuilder stringBuilder = new StringBuilder();
- String line;
- while ((line = bufferedReader.readLine()) != null) {
- stringBuilder.append(line);
- }
- String htmlString = stringBuilder.toString().replace("{{name}}","1212").replace("{{party}}","12121121212").replace("{{table}}", " <tr>\n" +
- " <td>1</td>\n" +
- " <td>2</td>\n" +
- " <td>3</td>\n" +
- " </tr>");
- // System.out.println(htmlString);
-
- ; // 要将内容中的特殊字符替换
-
- // 关闭文件读取器
-
- // 转换为pdf
- ITextRenderer renderer = new ITextRenderer();
- ITextFontResolver fontResolver = renderer.getFontResolver();
-
- OutputStream os = new FileOutputStream("output.pdf");
- renderer.setDocumentFromString(htmlString);
- fontResolver.addFont("src/main/resources/template/simkai.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
- fontResolver.addFont("src/main/resources/template/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
- fontResolver.addFont("src/main/resources/template/楷体.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
- fontResolver.addFont("src/main/resources/template/STZHONGS.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
- renderer.layout();
- renderer.createPDF(os);
-
- os.close();
- bufferedReader.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
-
-
- // html 中表单动态样式插入, 这是我的业务需要,你可以根据自己的需求进行参数的修改
-
- public static String generateTableHtml(Map<String, String> contents) {
- String params = contents.get("params");
- StringBuilder result = new StringBuilder();
- if (params == null || params.equals("")) {
- return "";
- } else {
- String[] split = params.split(",");
- int i = 1;
- for (String s : split) {
-
- String value = null;
- String[] split1 = s.split("-");
-
- if (split1.length == 2) {
- value = split1[1];
- }
- // result.append(split1[0]).append(split1[1]);
- // 核心处理
- 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(" ");
- i++;
- }
-
- }
- return result.toString();
- }
在进行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效果图(重要部分打码一下)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。