使用 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");
ConverterProperties converterProperties = new ConverterProperties(); converterProperties.setCharset("UTF-8"); converterProperties.setFontProvider(fontProvider);
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 { float: left; }
img { border-radius: 4px; }
</style> </head> <body> <div class="question"> <div class="sn-label">一、</div> <div class="stem"><手机的>防水能力<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>
|