当前位置: 首页 > 后端技术 > Java

注:解决itext5使用html模板生成PDF不显示中文的问题

时间:2023-04-01 23:09:39 Java

问题描述如题所示,生成的PDF文件中,除中文外,其他字符显示正常。错误但有效的方法:setstyle='font-family:'[font]';在<正文>中。这种方法不是万能的。汉字能否正常显示取决于程序运行的环境是否支持该字体。正确的方法:找到需要该字体的.ttf或.ttc文件(可以在操作系统中搜索,或者网上下载),放到一个目录下。在本文的示例中,将.ttf放在WEB-INF/classes下。Maven依赖:com.itextpdfitextpdf5.5.12com.itextpdf.toolxmlworker5.5.12Java代码://1使用模板解析引擎解析html模板。这个地方的方法是可选的,freemarker,thymeleaf或者其他的都行。目的是获取渲染后的html页面字符串//本例中使用了Spring自带的视图解析器(如果在spring配置文件或config类中进行了相关设置,这里可以跳过,直接从容器中获取即可)在其中获取解析器)ApplicationContextcontext=...InternalResourceViewResolverviewResolver=newInternalResourceViewResolver();viewResolver.setApplicationContext(context);viewResolver.setPrefix("/WEB-INF/pages");viewResolver.setSuffix(".jsp");MockHttpServletResponsemockResp=newMockHttpServletResponse();Viewview=viewResolver.resolveViewName("/xx/xx/template",Locale.CHINA);//模板位置view.render(data,httpServletRequest,mockResp);//data是渲染模板需要的数据//生成的html页面字符串StringhtmlStr=mockResp.getContentAsString();//2生成PDF输出到浏览器下载Documentdoc=newDocument();HttpServletResponse响应=...响应。setContentType("multipart/form-data");resp.setCharacterEncoding("UTF-8");resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("Download.pdf","UTF-8"));PdfWriterwriter=PdfWriter.getInstance(doc,resp.getOutputStream());//解决PDF中文不显示StringfontPath=this.getClasss().getClassLoader().getResource("simhei.ttf").getPath();//字体文件路径XMLWorkerFontProviderprovider=newXMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);provider.register(fontPath);//注册字体ByteArrayInputStreambis=newByteArrayInputStream(htmlStr.getBytes(Charset.forName("UTF-8")));XMLWorkerHelper.getInstance().parseXHtml(writer,doc,bis,Charset.forName("UTF-8"),provider);doc.close();writer.close();