记:解决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时,中文不显示的问题。的主要内容,如果未能解决你的问题,请参考以下文章

用itext5-1-生成PDF

XMLWorkerHelper性能缓慢

使用 PDFSharp 从 HTML 模板生成 PDF 并发送到浏览器

使用nodejs从模板生成PDF的最佳方法

iTextSharp生成pdf含模板---制作pdf模板

itext5去掉pdf不能复制权限