Springboot和Thymeleaf HTML模板:转换为PDF后,汉字消失

时间:2018-09-13 09:42:12

标签: spring-boot utf-8 thymeleaf

我们从html模板中生成pdf发票。

但是当html文本为中文时,结果会有问题。

尽管使用UTF-8进行了设置,但特殊字符不会显示。

这是html模板:

enter image description here

结果如下: enter image description here

我们在模板解析器和html模板标头中设置UTF-8编码。

我们缺少什么?

html模板

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">

    <head>
        <title>风标汽车租赁服务收据</title>
               <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
     ....
</html>

和模板解析器:

@Bean
public FileTemplateResolver fileTemplateResolver() throws URISyntaxException {
    FileTemplateResolver fileTemplateResolver = new FileTemplateResolver();
    fileTemplateResolver.setPrefix(getPath());
    fileTemplateResolver.setTemplateMode("LEGACYHTML5");
    fileTemplateResolver.setSuffix(".html");
    fileTemplateResolver.setCharacterEncoding("UTF-8");
    fileTemplateResolver.setOrder(1);
    return fileTemplateResolver;
}

1 个答案:

答案 0 :(得分:0)

我已经找到了解决方案,方法是下载simsun的ttc文件并将其添加到项目资源中。

然后将其添加到渲染器的字体中,如下所示:

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ITextRenderer renderer = new ITextRenderer();

        ITextFontResolver resolver = renderer.getFontResolver();
        final ClassPathResource fonts = new ClassPathResource("fonts/simsun.ttc");
        resolver.addFont(fonts.getPath(), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        renderer.setDocumentFromString(processedHtml);
        renderer.layout();
        renderer.createPDF(byteArrayOutputStream, false);
        renderer.finishPDF();

还请确保从pom.xml中删除true过滤条件,否则Spring会破坏二进制ttc文件。

        <resources> 
            <resource> 
                <directory>src/main/resources</directory> 
                <filtering>true</filtering>   -- remove this line
            </resource> 
        </resources> 

我希望对您有帮助