记:解决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

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();

你可能感兴趣的:(pdfjavaitextpdf)