关于Windows使用wkhtmltox工具的乱码问题
前言
Windows中JAVA使用wkhtmltox工具转换HTML为PDF过程中出现了乱码,本文详细解释我遇见的乱码问题以及解决方法
相关文章(本文与这两篇有密切关系):
⚠️:此片文章基于Windows操作系统
一、乱码错误
1、错误目标网址
https://12366.chinatax.gov.cn/bsznBLH/print?bh=8d74c639bf954fd988c872ae548612df
2、错误说明
👇转换的PDF文件里的表格中部分字体乱码,乱码字体属于黑体
3、错误截图
二、乱码解决方法
原因分析
在macOS操作系统
中的wkhtmltox工具转换的PDF文件并没有出现该字体乱码问题,但Windows操作系统
则是出现了以上问题(转图片无影响);与java程序并无具体关系,因为在cmd黑窗口中运行该工具时转换的PDF文件就已经出现了该问题
-
第一次尝试:我尝试在别的最新版本的Windows系统中执行该工具转换,发现跟系统版本没有任何关系。
-
第二次尝试:我在网络上寻找解决办法中,大多数都是说字体缺失,但是我的电脑中不存在缺失
黑体
字体的问题,但就是这个表格中的黑体字出现了乱码错误,其它部分一切正常。 -
第三次尝试:我在想能不能通过java程序在每次转换之前将原网址的黑体字全部扫描且更换为别的字体,按照这个想法才最终解决了乱码问题(其实不算解决、但又解决了:如解 具体看下面的方法跟解释吧)
1、自定义字体文件
解决这次乱码问题的方法就是引入自定义的CSS文件
;通过改变原来网页代码中的字体样式,从而达到解决乱码问题的目的
1 | <style> |
//创建一个css文件,将上面代码复制进去即可
@font-face:引入系统字体文件,可以引入多种字体
C:\Windows\Fonts\simhei.ttf:是windows系统黑体文字所在的位置
myFont:自定义的字体名称,切勿使用“黑体”,“宋体”等字样作为自定义名称,否则无效
.MsoNormal *:将MsoNormal类名下的所以字体改为黑体(需要更改别的类下的字体,也是这样)
2、在JAVA中引入自定义字体文件
引入自定义字体文件
的路径
1 | //由于wkhtmltox对于某些字体转换失效,需要引入的自定义css文件;文件位置可自定义,最好是放在项目中(对于是路径定义这里不细说,都是直接全路径引用) |
这次的修改代码以JAVA使用wkhtmltox工具生成PDF、图片文件一文中的代码为基础,转换为图片的方法无需修改
具体修改代码如下
1 | /** |
3、成功截图
经过引入css文件,转换后的文件便没有乱码问题了
三、问题总结
虽然这样是解决了乱码的问题,但是并不是一个完全解决的办法(但程序跑起来没问题就行)最后为什么说是没有完全解决?
我一开始在谷歌浏览器将网页保存到本地,然后将上面的css代码写入到保存在本地的html文件中,我发现确实能扫描到这个类名下的所有字符且更改为我设定的字体。
但是,这是在本地修改的,然而wkhtmltox工具是线上实时转换html为PDF的;因此无论我引入什么楷体、黑体、宋体或是其他字体,最终转换的PDF文件中的字体都是宋体。
因此,虽然在JAVA中引入字体文件能解决乱码,但是最终效果却不显示自定义的字体,而是显示宋体。
我猜测,大概率是因为在实时转换中,我引入的黑体字(内部样式)与原网页中定义的字体(行内样式)发生了冲突,然后系统自动选择了一个默认的字体(宋体),所以才达到解决乱码但字体没有按自定义显示的效果
前端知识的欠缺还是导致我无法完全解释这一问题,所以还是需要再研究、深入学习;但是出现此乱码问题在本片解决方法中也确实能实现不乱码的结果
- 这是借助JAVA程序在转换过程中引入css文件才能达到这个效果
- wkhtmltox工具本身并没有发生任何改变,在Windows的cmd黑窗口中直接将这类型的乱码网页转换为PDF还是会乱码
- 在macOS操作系统中则不会发生乱码
借鉴链接
java 代码 用 wkHtmlToPdf 工具生成 pdf 文档 并 设置自定义 字体
更多关于wkhtmltox扩展工具的知识持续更新中!!!
声明
借鉴部分均注明了原文出处,可在文章的`借鉴链接`处获取原文出处文中若内容有涉及原版权,请邮件联系elvin-chen@qq.com,涉及的相关文章或内容将会及时更改或取消发布