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