如何使用Freemarker生成中文PDF避免乱码?
摘要:添加依赖 <dependency> <groupId>org.freemarker<groupId> &a
添加依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.32</version>
</dependency>
<dependency>
<groupId>com.openhtmltopdf</groupId>
<artifactId>openhtmltopdf-pdfbox</artifactId>
<version>1.0.10</version>
</dependency>
java代码
public void exportPdf(String html, String outputPath) throws Exception {
PdfRendererBuilder builder = new PdfRendererBuilder();
builder.useFastMode();
// 注册思源宋体——关键点
builder.useFont(() -> getClass().getClassLoader()
.getResourceAsStream("xxx/siyuansongti.ttf"), "Source Han Serif CN");
builder.useFont(() -> getClass().getClassLoader()
.getResourceAsStream("xxx/DejaVuSans-7.ttf"), "DejaVu Sans");
builder.withHtmlContent(html, null);
builder.toStream(new FileOutputStream(outputPath));
builder.run();
}
@GetMapping("test")
public void test() throws Exception{
Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
cfg.setDefaultEncoding("UTF-8");
cfg.setClassLoaderForTemplateLoading(
this.getClass().getClassLoader(),
"templates"
);
Template tpl = cfg.getTemplate("xxx/index.ftl");
StringWriter writer = new StringWriter();
tpl.process(buildDto(), writer);
exportPdf(writer.toString(), "D:/xxx.pdf");
}
ftl模板使用字体库
文件名:xxx.ftl
ps:处理中文乱码
body {
font-family: "Source Han Serif CN", "DejaVu Sans";
font-size: 12px;
margin: 0;
padding: 0;
}
字体库
https://chenyanbin-software.oss-cn-guangzhou.aliyuncs.com/%E5%AD%97%E4%BD%93%E5%BA%93/DejaVuSans-7.ttf
https://chenyanbin-software.oss-cn-guangzhou.aliyuncs.com/%E5%AD%97%E
