解决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 相关文章推荐
python里大整数相乘相关技巧指南
Sep 12 Python
Python基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
使用pdb模块调试Python程序实例
Jun 02 Python
python方向键控制上下左右代码
Jan 20 Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
Sep 18 Python
python实现大量图片重命名
Mar 23 Python
python 实现图像快速替换某种颜色
Jun 04 Python
Python+PyQt5+MySQL实现天气管理系统
Jun 16 Python
Python 列表推导式需要注意的地方
Oct 23 Python
Python selenium绕过webdriver监测执行javascript
Apr 12 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
深入了解php4(1)--回到未来
2006/10/09 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
js判断变量是否空值的代码
2008/10/26 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
vue.js的安装方法
2017/05/12 Javascript
通过js控制时间,一秒一秒自己动的实例
2017/10/25 Javascript
Vuex的基本概念、项目搭建以及入坑点
2018/11/04 Javascript
解决node-sass偶尔安装失败的方法小结
2018/12/05 Javascript
微信小程序冒泡事件及其阻止方法实例分析
2018/12/06 Javascript
js中的数组对象排序分析
2018/12/11 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
2020/08/13 Javascript
详解Python中的正则表达式的用法
2015/04/09 Python
详解Python中DOM方法的动态性
2015/04/11 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
Python如何使用函数做字典的值
2019/11/30 Python
CentOS7下安装python3.6.8的教程详解
2020/01/03 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
详解python实现可视化的MD5、sha256哈希加密小工具
2020/09/14 Python
HTML5通用接口详解
2016/06/12 HTML / CSS
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
文明城市标语
2014/06/16 职场文书
2014党员学习《反腐倡廉警示教育读本》思想汇报
2014/09/13 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
党员对十八届四中全会的期盼思想汇报范文
2014/10/17 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
Java集成swagger文档组件
2021/06/28 Java/Android