解决PDF 转图片时丢文字的一种可能方式


Posted in Python onMarch 04, 2021

问题

Python 中 PDF 转图片一般用的是 pdf2image。有时我们会发现 PDF 转出来的图片都是空白,或者缺失了一些字,具体表现就是一些应该有字的区域是空白。

由于某些原因我不能把出现问题的文件放上来,不过大致就是这个情况。

主要的代码如下:

images = pdf2image.convert_from_path('/path/to/pdf', output_folder='images/', fmt='jpg')

运行时可能会发现代码没有任何异常,但是结果不对。

分析和解决

其实 pdf2image 底层默认使用的是 pdftoppm 来转图片,我们可以直接使用其来测试有问题的 PDF,会发现输出了一些警告:

除 pdftoppm 外,pdf2image 在两种情况下会使用 pdftocairo 来转图片,具体是:

当要转成 tif/tiff 格式时

当 transparent=True(默认为 False)且要转成 png/tif/tiff 时

Missing language pack for 'Adobe-GB1' mapping

很明显是缺失了语言包。

而且字缺失,自然而然想到的是字体缺失,即系统中没有 PDF 中的字体。

我们需要找到对应的字体,然后安装上。

一般来说,Linux 系统中,直接复制相应的字体文件到 /usr/share/fonts/ 目录下即可,可以使用 fc-list :lang=zh-cn 来查看当前系统有哪些中文字体。

对于中文来说,Noto CJK 字体可以覆盖所有的字,可以尝试下载安装此字体,有些系统可能自带。

有了字体,你再试的时候可能会发现还是不行,因为你还需要另一个东西:poppler-data。

这个东西是干嘛用的?根据作者的描述:

This package consists of encoding files for use with poppler. The encoding files are optional and poppler will automatically read them if they are present. When installed, the encoding files enables poppler to correctly render CJK and Cyrrilic properly. While poppler is licensed under the GPL, these encoding files have different license, and thus distributed separately.

大致就是这个包里是一些编码文件,可以让 poppler 正确渲染 CJK 文字。

我们可以通过 apt 来安装:

sudo apt install poppler-data

然后再次尝试,应该就可以成功转成正常的图片了。

总结一下,你需要两个东西:

正确的字体文件

poppler-data

Reference

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Python 相关文章推荐
2款Python内存检测工具介绍和使用方法
Jun 01 Python
Python对象的深拷贝和浅拷贝详解
Aug 25 Python
python中尾递归用法实例详解
Apr 28 Python
在Python下尝试多线程编程
Apr 28 Python
python下paramiko模块实现ssh连接登录Linux服务器
Jun 03 Python
Python单链表简单实现代码
Apr 27 Python
详解python之多进程和进程池(Processing库)
Jun 09 Python
Python 判断是否为质数或素数的实例
Oct 30 Python
python自动化生成IOS的图标
Nov 13 Python
python 求10个数的平均数实例
Dec 16 Python
python类共享变量操作
Sep 03 Python
Python Flask实现进度条
May 11 Python
pandas数据分组groupby()和统计函数agg()的使用
Mar 04 #Python
pyx文件 生成pyd 文件用于 cython调用的实现
Mar 04 #Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
Mar 04 #Python
python 中 .py文件 转 .pyd文件的操作
Mar 04 #Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
Mar 04 #Python
python 指定源路径来解决import问题的操作
Mar 04 #Python
python源文件的字符编码知识点详解
Mar 04 #Python
You might like
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
2020/06/28 PHP
PHP实现根据数组某个键值大小进行排序的方法
2018/03/13 PHP
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
JavaScript从0开始构思表情插件
2016/07/26 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
js获取当前周、上一周、下一周日期
2017/03/19 Javascript
jQuery中库的引用方法
2018/01/06 jQuery
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
Vue封装的组件全局注册并引用
2019/07/24 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
vue单文件组件无法获取$refs的问题
2020/06/24 Javascript
vue实现标签云效果的示例
2020/11/09 Javascript
[04:23]DOTA2上海特锦赛小组赛第一日 TOP10精彩集锦
2016/02/27 DOTA
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
Python实现的redis分布式锁功能示例
2018/05/29 Python
Python3多进程 multiprocessing 模块实例详解
2018/06/11 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
python实现抖音点赞功能
2019/04/07 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
Python 绘制可视化折线图
2020/07/22 Python
利用python汇总统计多张Excel
2020/09/22 Python
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
shell程序中如何注释
2012/02/17 面试题
Servlet面试题库
2015/07/18 面试题
新闻学专业大学生职业生涯规划范文
2014/03/02 职场文书
公司授权委托书范本
2014/04/03 职场文书
法律专业求职信
2014/05/24 职场文书
干部对照检查材料范文
2014/08/26 职场文书
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书
护士个人总结范文
2015/02/13 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书