记:解决itext5使用html模板生成PDF时,中文不显示的问题。
Posted 大qs_icezhou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记:解决itext5使用html模板生成PDF时,中文不显示的问题。相关的知识,希望对你有一定的参考价值。
问题描述如题所示,生成的PDF文件中,除了中文,其他字符正常显示。
错误但有效的方法:在<body>
中设置style=\'font-family:\'[字体]\';
。此方法并非万金油,中文字符能否正常显示,依赖程序运行所在的环境是否支持该字体。
正确方法:找到需要字体的.ttf
或.ttc
文件(可以在操作系统中搜,也可以网上下),然后放到一个目录下。本文示例中,将.ttf
放到了WEB-INF/classes
下面。
Maven依赖:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.12</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.12</version>
</dependency>
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();
以上是关于记:解决itext5使用html模板生成PDF时,中文不显示的问题。的主要内容,如果未能解决你的问题,请参考以下文章