Content Table

Html 转为 Pdf

使用 html2pdf 把 Html 转为 Pdf,实际项目中可以先借助 Freemarker 模板生成 Html,然后再转换为 Pdf。

缺点: html2pdf 不支持 CSS 的 flex 和 grid 布局。

依赖

1
implementation "com.itextpdf:html2pdf:2.1.7"

转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.layout.font.FontProvider;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Html2Pdf {
public static void main(String[] args) throws IOException {
File htmlSrc = new File("/Users/Biao/Desktop/x.html");
File pdfDest = new File("/Users/Biao/Desktop/x.pdf");

// 使用中文字体解决不显示中文问题: 字体文件可以从系统中找,也可以从网上下载
FontProvider fontProvider = new FontProvider();
fontProvider.addStandardPdfFonts();
fontProvider.addFont("/Users/Biao/Desktop/Yahei.ttf");
// fontProvider.addDirectory("..."); // 添加文件夹下的所有字体

ConverterProperties converterProperties = new ConverterProperties();
converterProperties.setCharset("UTF-8");
converterProperties.setFontProvider(fontProvider);

// HTML 中本地图片要使用 file:// 的格式,如 file:///Users/Biao/Desktop/shot.png
HtmlConverter.convertToPdf(htmlSrc, pdfDest, converterProperties);
}
}

Html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>Document</title>
<style>
.question {
border: 1px solid gray;
margin-bottom: 12px;
}

.sn-label {
/* width: 50px; */
float: left;
}

img {
border-radius: 4px;
}

</style>
</head>
<body>
<div class="question">
<div class="sn-label">一、</div>
<div class="stem">&lt;手机的&gt;防水能力<sup>很容易被用户所忽略</sup>,毕竟一款手机价值几千元也没有用户会真正拿手机泡在水里。但是如果拥有出色的防水能力,可以保证不小心跌落水利的时候,手机功能不受影响。事实上,在所有手机品牌中,防水能力做得最好的要数苹果和三星。</div>

<img src="file:///Users/Biao/Desktop/shot.png" width="400">
</div>

<div class="question">
<div class="sn-label">二、</div>
<div class="stem">手机的防水能力<sub>很容易被用户所忽略</sub><strong>毕竟一款手机价值几千元也没有用户会真正拿手机泡在水里</strong>。但是如果拥有出色的防水能力,可以保证不小心跌落水利的时候,手机功能不受影响。事实上,在所有手机品牌中,防水能力做得最好的要数苹果和三星。</div>

<img src="file:///Users/Biao/Desktop/shot.png" width="400">
</div>
</body>
</html>