解决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探索之ModelForm代码详解
Oct 26 Python
理解python中生成器用法
Dec 20 Python
python字符串与url编码的转换实例
May 10 Python
python实现雨滴下落到地面效果
Jun 21 Python
Python3.5 处理文本txt,删除不需要的行方法
Dec 10 Python
Python箱型图处理离群点的例子
Dec 09 Python
解决pytorch DataLoader num_workers出现的问题
Jan 14 Python
Python如何用filter函数筛选数据
Mar 05 Python
Python super()方法原理详解
Mar 31 Python
python中字符串的编码与解码详析
Dec 03 Python
pytorch中的model.eval()和BN层的使用
May 22 Python
只用Python就可以制作的简单词云
Jun 07 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
用php实现的下载css文件中的图片的代码
2010/02/08 PHP
php中++i 与 i++ 的区别
2012/08/08 PHP
PHP递归调用的小技巧讲解
2013/02/19 PHP
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
js调试工具Console命令详解
2014/10/21 Javascript
Nodejs 搭建简单的Web服务器详解及实例
2016/11/30 NodeJs
Angular.js中ng-if、ng-show和ng-hide的区别介绍
2017/01/20 Javascript
javascript数据类型详解
2017/02/07 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
浅谈Vue.js
2017/03/02 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
微信小程序实现手指触摸画板
2018/07/09 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
2019/07/23 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
Python常见数据结构详解
2014/07/24 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
2019/04/25 Python
如何通过python画loss曲线的方法
2019/06/26 Python
python 消除 futureWarning问题的解决
2019/12/25 Python
Python容器类型公共方法总结
2020/08/19 Python
天巡全球:Skyscanner Global
2017/06/20 全球购物
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
应届护士推荐信
2013/11/16 职场文书
数控专业应届生求职信
2013/11/27 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
英文推荐信格式范文
2014/05/09 职场文书
贷款承诺书
2015/01/20 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电
Vue和Flask通信的实现
2021/05/19 Vue.js
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
2022/04/09 MySQL
MySql重置root密码 --skip-grant-tables
2022/04/11 MySQL