查找解决使用html2pdf插件导出PDF不展示中文的问题
在外网环境写了个导出PDF的demo可以正常导出PDF,也可以正常展示中文,但是当我把代码移植到内网服务器上时,导出的PDF不能正常展示中文,日志也没有打印异常,于是就用源码执行看看什么原因,排查过程:
首先,查看工具类,发现中文是读取的外部文件,
随后读取文件加载到字体列表:
*** 字体所在目录*/private static final String FONT_RESOURCE_DIR = "/font";/*** @param htmlContent html文本* @param dest 目的文件路径,如 /xxx/xxx.pdf* @param imgBaseUri 图片所在资源目录,可为null* @throws IOException IO异常*/public static void createPdf(String htmlContent, String dest,String imgBaseUri) throws IOException {ConverterProperties props = new ConverterProperties();// props.setCharset("UFT-8"); 编码FontProvider fp = new FontProvider();fp.addStandardPdfFonts();// .ttf 字体所在目录String resources = Html2PdfUtil.class.getResource(FONT_RESOURCE_DIR).getPath();System.out.println(resources);fp.addDirectory(resources);props.setFontProvider(fp);
。。。
于是接下来就一路debug这个方法:fp.addDirectory(resources),在跟踪到FontSet类的如下方法时,发现else if中明明读取的后缀是“.ttf”却不进此分支,应该是addFont(file)方法出错了:
/*** Add all the fonts in a directory and possibly its subdirectories.** @param dir path to directory.* @param scanSubdirectories recursively scan subdirectories if {@code true}.* @return number of added fonts.*/public int addDirectory(String dir, boolean scanSubdirectories) {int count = 0;String[] files = FileUtil.listFilesInDirectory(dir, scanSubdirectories);if (files == null)return 0;for (String file : files) {try {String suffix = file.length() < 4 ? null : file.substring(file.length() - 4).toLowerCase();if (".afm".equals(suffix) || ".pfm".equals(suffix)) {// Add only Type 1 fonts with matching .pfb files.String pfb = file.substring(0, file.length() - 4) + ".pfb";if (FileUtil.fileExists(pfb) && addFont(file)) {count++;}} else if ((".ttf".equals(suffix) || ".otf".equals(suffix) || ".ttc".equals(suffix))&& addFont(file)) {count++;}
继续跟下去,找到FontInfo类的create方法,在执行fetchDescriptor(fontName)方法返回null:
static FontInfo create(String fontName, String encoding, String alias, Range range) {FontCacheKey cacheKey = FontCacheKey.create(fontName);FontProgramDescriptor descriptor = getFontNamesFromCache(cacheKey);if (descriptor == null) {descriptor = FontProgramDescriptorFactory.fetchDescriptor(fontName);putFontNamesToCache(cacheKey, descriptor);}return descriptor != null ? new FontInfo(fontName, null, encoding, descriptor, range, alias) : null;}
再接下去就是获取文件内容之类的了,再上面看到截图中ttf文件是编译了的,再点开war包中的ttf文件,显示:
另一个字体文件simsun.ttf,其实主要用到的是字体文件simsun.ttf,于是把源文件复制到war包中,再启动程序,导出pdf,正常:
查找解决使用html2pdf插件导出PDF不展示中文的问题相关推荐
- bootstrap table export插件导出pdf格式文件中文乱码问题解决办法
bootstrap table export插件导出pdf格式文件中文乱码的问题折腾了我整整两天,网上到处都是改源码,自己设置字体的方案,我都没搞定.结果今天看到官方文档(地址:GitHub - hh ...
- 解决Angular Kendo UI 导出PDF中文乱码
在使用 Kendo UI for Angular 的 PDFExportComponent 组件时,如果内容是中文则导出PDF将会出现乱码,网上许多人认为是官方不支持中文,但其实不然,阅读文档 The ...
- Jasperreport导出pdf内容展示不完全处理
[+] 场景 测试过程发现,尽管已经设置如下配置: Position Type : Fix Relative to Top Stretch Type:Relative to Band Height ...
- java 使用itext导出PDF文件,中文不显示问题解决
之前写的java 使用itext 导出pdf 发现有个问题,在今天使用的时候,发现一个问题,就是当单元格中写中文的时候,导出来的pdf中文不显示. java 使用itext导出PDF文件,图片文字左右 ...
- pd4ml技术html导出pdf,支持中文,兼容Linux
java html导出pdf的文章有很多大多都使用的是itext,其实用过的都知道itext有时并不能满足我们的需求,不能兼容html的样式,而且从html页面导出的图片到pdf中也并不好处理.Fly ...
- ITextRenderer导出pdf不显示中文
ITextRenderer freemarker 生成pdf demo,并解决中文不显示的问题 package com.pdf;import com.lowagie.text.DocumentExce ...
- echarts 图表导出PDF(带滚动条)/图片导出PDF
echarts 图表导出PDF[带滚动条]/图片导出PDF 效果展示 提出问题 思考问题 解决问题 导出PDF 里面的页头中文乱码问题 参数说明 效果展示 提出问题 在开发过程中,有需求是将展示出来的 ...
- VScode+MarkDown导出PDF图片显示问题
问题 Windows10下使用VScode写MarkDown,但是在使用本地图片时在预览窗口可以完整显示图片,但是在用MarkDown-PDF插件导出PDF后,发现图片没有显示,以下是我导入图片时使用 ...
- PDF怎么支持中文 KendoUI 导出PDF
大家好,我是米娅 我尝试了很多种kendo 上PDF的导出,包括Grid与整个div界面.都不支持中文,它官网上面的都是支持英文的,我导出的中文都是这种(□□□)方框,数字和英文字符都能正确的导出, ...
最新文章
- 误删oracle数据库文件,误删Oracle数据文件导致数据库无法打开
- python数据预测_python时间序列预测股票走势
- 介绍Linux中cp直接覆盖不提示的方法
- android core log,Android 日志系统(Logcat)的实现分析
- 查看tomcat管理信息
- c++卸载工具_IIS修复IIS出现错误后如何完全卸载重装
- 一个init.php(网站启始)的一般信息
- BZOJ 1208 HNOI 2004 宠物收养所 splay
- Oracle的CaseWhen
- vscode 终端美化
- 电气simulink常用模块_支持PLC编程的5大电气语言,你会几种?
- codeforces 69A. Young Physicist
- body加背景图片没反应_body背景图片,给body加背景图片
- 使用决策树算法预测西瓜的好坏
- apache avro 简介
- U1C1 数据挖掘与文本分析的背景与实际应用
- 用户体验的模型:Whitney Quesenbery的5E原则
- 蒙特卡洛 c语言,从伪随机数的产生到高大上的蒙特卡洛算法(C语言实现)
- Java学习路线:day11 客户信息管理软件
- 微软模拟飞行10厦门航空涂装_《微软模拟飞行》海量附加内容!最真实的飞行体验...