PDF字体乱码问题分析
背景
最近身体有恙,于是就想起来整理下这几年体检的电子报告汇总看看。结果发现在善诊平台下载的体检报告在电脑上看直接乱码了。不过这种字符集的问题怎么能难得了本码农呢,所以就尝试起各种办法进行恢复,结果发现这果然是个深坑。。。
问题
本来好好的一个 PDF 报告,结果打开后画风是这样的:

我本地的环境是 Macbook,尝试了用 Chrome 打开、自带的 Preview 工具打开,都是同样的结果。除了 ASCII 字符能展示,其他所有的中文信息都没有,但是 PDF 中的所有图片都能正常展示。这么看大概率还是中文字体的问题。
分析
EXIF信息
不管如何,首先肯定要看一下这个 PDF 本身带的 EXIF 信息,寻找一些分析线索。这里 mac 下可以直接在 Preview 里看,不过我更喜欢用命令行工具 exiftool
看。
$ brew install exiftool
$ exiftool -a -G1:2 report.pdf
[ExifTool] ExifTool Version Number : 12.42
[System:Other] File Name : report.pdf
[System:Other] Directory : .
[System:Other] File Size : 522 kB
[System:Other] File Permissions : -rw-r--r--
[System:Time] File Modification Date/Time : 2022:10:27 11:06:00+08:00
[System:Time] File Access Date/Time : 2022:10:27 14:14:04+08:00
[System:Time] File Inode Change Date/Time : 2022:10:27 15:34:02+08:00
[File:Other] File Type : PDF
[File:Other] File Type Extension : pdf
[File:Other] MIME Type : application/pdf
[PDF:Document] PDF Version : 1.7
[PDF:Document] Linearized : No
[PDF:Document] PDF Version : 1.7
[PDF:Document] Tagged PDF : Yes
[PDF:Document] Page Count : 11
[PDF:Document] Page Mode : UseNone
[PDF:Document] Title :
[PDF:Document] Subject : FastReport PDF export
[PDF:Document] Keywords : 宋体, Bold, -, SimSun;宋体, -, SimSun;微软雅黑, -, Microsoft, YaHei;微软雅黑, Bold, -, Microsoft, YaHei, Negreta;宋体, Bold, -, SimSun;宋体, -, SimSun;微软雅黑, -, Microsoft, YaHei;微软雅黑, Bold, -, Microsoft, YaHei, Negreta;
[PDF:Document] Creator :
[PDF:Document] Producer :
[PDF:Author] Author : FastReport
[PDF:Time] Create Date : 2021:02:24 15:35:03
[PDF:Time] Modify Date : 2021:02:24 15:35:03
划一下重点:
- Keywords 字段似乎展示了他使用的字体信息,看起来都是微软字体。
- Author 和 Subject 字段似乎展示了生成这个 PDF 的工具:FastReport。
众所周知 Mac 是不带微软字体的,那么这个问题似乎就是微软字体导致的。
微软字体替换
既然是 Mac 找不到微软字体,那我就把微软字体安装到本地应该就行了吧。于是我就找了个 Windows 电脑,跑去 C:\Windows\Fonts
下把所有的 ttf , ttc 文件拷贝到 MacBook 的 ~/Library/Fonts
下,作为当前用户的字体。
当然,这些字体看起来比较多,但是重要的还是 sim (中易系列)和 msyh (微软雅黑系列) 打头的这几个。
C:\Windows\Fonts> dir|findstr sim
2019/10/15 21:46 10,578,152 simfang.ttf
2019/10/15 21:46 9,753,388 simhei.ttf
2019/10/15 21:46 11,787,328 simkai.ttf
2019/12/07 17:08 18,214,472 simsun.ttc
2019/12/07 17:08 17,064,180 simsunb.ttf
C:\Windows\Fonts> dir|findstr msyh
2019/12/07 17:08 19,647,736 msyh.ttc
2019/12/07 17:09 16,829,116 msyhbd.ttc
2019/12/07 17:09 12,139,380 msyhl.ttc
可是,安装好后发现并不起作用,Chrome 和 Preview 还是不能用,感觉这就不太合理了。于是我把 PDF 拷回 Windows 下试试,发现果然连 Windows 自己都不能打开。。。
思考了一下,既然 PDF 格式主要是 Adobe 公司主导的,是不是他家的官方软件就能搞定呢?
Adobe Acrobat 的尝试
看网上有人说 Adobe Acrobat 有个 Chrome 插件,据说能解决很多乱码问题。于是就抱着试试看的心情装了一个。
果然没什么卵用。
考虑到 Adobe Acrobat 是收费的,为了这个小问题直接买有点不合适,又懒得找破解,于是就去 PDD 花 9¥ 买了个破解版。
软件是童叟无欺的,不过还是没什么卵用,依然预览起来都是乱码。而且还报了一个乱码的错,似乎是在说找不到一些字体(这些字体的名字是乱码的)。一番搜寻,发现有人在 Google Group 里提到:
通常对于字体的识别方式是先在文档内部寻找内嵌字体文件,如果没有字体文件,那么就根据文档所使用的字体名称在用户本地查找 相应的字体,最后使用替代机制——利用本地的默认字体来显示。
很不幸的是,一般的默认字体都是不识别非 acsii 字符的,所以就会出现各种乱码和字体很丑的 情况。
再结合报错时的一大堆乱码,那么我有理由进一步怀疑:如果文件的文本字符集有问题,而字体名又是非纯 ASCII 码的中文名,那么文本字符集的问题就会导致字体名的解析问题,进而就会导致字体解析的问题。但是究竟具体要怎么做才能修正字符集呢?不知道。
忽然想起来 PDF 传到电脑前明明在手机上预览过,于是我把目光转到了手机。。。
WPS 的逆袭
把 PDF 发回我的小米手机,发现果然能成功打开。
既然这样,那我是不是可以在手机上对 PDF 进行编辑,将有问题的字体切换成好使的通用字体,再重新保存呢?
小米默认采用的是 WPS 的组件,下载 WPS 后尝试编辑发现竟然又要冲会员。不能忍,于是下载了一个不要钱的 福昕PDF编辑器。结果福昕编辑器竟然又不能打开了。
难道说只能用 WPS 打开?于是我又在 Mac 上下载了 WPS,果然能打开了。。。
绕了一圈,能否正确打开这个 PDF 这件事跟平台没有任何关系,只跟软件有关。不得不说 FastReport 这个工具生成的 PDF 是真的流氓。
可是 WPS 的 PDF 编辑功能需要开通超级会员。没办法,只能又去 PDD 花了 2.9¥ 买了一个 ⭐️WPS 一天超级会员试用版⭐️ 。
但是问题又来了,PDF 的编辑非常麻烦,每个文本框都是独立的,不能一次全选所有文本然后统一修改字体,只能一个框一个框的选。。。

忽然想到,为啥不先把 PDF 转成 Word,利用 Word 快速修改字体,然后再保存成 PDF 呢?
于是尝试了 WPS 的 PDF 转 Word 功能,按照刚才的思路,导出 Word 之后将所有文字的字体统一改成了 Arial ,再导出回 PDF。
终于成功生成了在各个平台都能正常使用的 PDF 。
iLovePDF
问题解决了,但是为了用一个小功能就要给流氓软件冲会员,实在不能忍。思考一番忽然明白了,我需要的其实只是一个“高兼容性的PDF转Word“工具——iLovePDF。
有免费工具用了,谁还愿意交智商税呢?
