记(解决itext5使用html模板生成PDF时,中文不显示的问题。)

问题描述如题所示,生成的PDF文件中,除了中文,其他字符正常显示。
错误但有效的方法:在中设置style='font-family:'[字体]'; 。此方法并非万金油,中文字符能否正常显示,依赖程序运行所在的环境是否支持该字体。
正确方法:找到需要字体的.ttf.ttc文件(可以在操作系统中搜,也可以网上下),然后放到一个目录下。本文示例中,将.ttf放到了WEB-INF/classes下面。
Maven依赖:

com.itextpdf itextpdf 5.5.12 com.itextpdf.tool xmlworker 5.5.12

【记(解决itext5使用html模板生成PDF时,中文不显示的问题。)】Java代码:
//1 使用模板解析引擎解析html模板。这个地方方法随意,freemarker,thymeleaf或者其他的都行。目的是获取到渲染后的html页面字符串 //本示例中使用的是Spring自带的视图解析器(如果在spring配置文件或config类中进行了相关设置,此处可跳过,直接从容器中获取解析器即可) ApplicationContext context = .... InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setApplicationContext(context); viewResolver.setPrefix("/WEB-INF/pages"); viewResolver.setSuffix(".jsp"); MockHttpServletResponse mockResp = new MockHttpServletResponse(); View view = viewResolver.resolveViewName("/xx/xx/template",Locale.CHINA); //模板位置 view.render(data, httpServletRequest, mockResp); //data是渲染模板需要的数据//生成的html页面字符串 String htmlStr = mockResp.getContentAsString(); //2 生成PDF并输出到浏览器下载 Document doc = new Document(); HttpServletResponse resp = ... resp.setContentType("multipart/form-data"); resp.setCharacterEncoding("UTF-8"); resp.setHeader("Content-Disposition","attachment; filename="+URLEncoder.encode("下载.pdf","UTF-8")); PdfWriter writer = PdfWriter.getInstance(doc,resp.getOutputStream()); // 解决PDF中文不显示 String fontPath = this.getClass().getClassLoader().getResource("simhei.ttf").getPath(); //字体文件路径 XMLWorkerFontProvider provider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); provider.register(fontPath); //注册字体ByteArrayInputStream bis = new ByteArrayInputStream(htmlStr.getBytes(Charset.forName("UTF-8"))); XMLWorkerHelper.getInstance().parseXHtml(writer,doc,bis,Charset.forName("UTF-8"),provider); doc.close(); writer.close();

    推荐阅读