解决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 PyQt5标准对话框用法示例
Aug 23 Python
使用pandas批量处理矢量化字符串的实例讲解
Jul 10 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
Python中遍历列表的方法总结
Jun 27 Python
Python实现Restful API的例子
Aug 31 Python
python将邻接矩阵输出成图的实现
Nov 21 Python
Python通过zookeeper实现分布式服务代码解析
Jul 22 Python
改变 Python 中线程执行顺序的方法
Sep 24 Python
python 根据列表批量下载网易云音乐的免费音乐
Dec 03 Python
PyTorch 中的傅里叶卷积实现示例
Dec 11 Python
python自动化八大定位元素讲解
Jul 09 Python
PyTorch device与cuda.device用法
Apr 03 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 使用post,get的一种简洁方式
2010/04/25 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
PHP Header用于页面跳转时的几个注意事项
2016/10/21 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
jquery选择器(常用选择器说明)
2010/09/28 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
用jquery写的菜单从左往右滑动出现
2014/04/11 Javascript
jquery删除数组中重复元素
2016/12/05 Javascript
js定时器实例分享
2016/12/20 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
react实现点击选中的li高亮的示例代码
2018/05/24 Javascript
9个JavaScript日常开发小技巧
2020/10/06 Javascript
vue-video-player 断点续播的实现
2021/02/01 Vue.js
Python 3中的yield from语法详解
2017/01/18 Python
Python中str.format()详解
2017/03/12 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
Python3 Random模块代码详解
2017/12/04 Python
Python实现读取Properties配置文件的方法
2018/03/29 Python
python lxml中etree的简单应用
2019/05/10 Python
Python的in,is和id函数代码实例
2020/04/18 Python
详解python中的lambda与sorted函数
2020/09/04 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
Python plt 利用subplot 实现在一张画布同时画多张图
2021/02/26 Python
Crucial英睿达法国官网:内存条及SSD固态硬盘升级
2018/07/13 全球购物
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
智能室内花园:Click & Grow
2021/01/29 全球购物
求高于平均分的学生学号及成绩
2016/09/01 面试题
优秀毕业生自我鉴定
2014/01/19 职场文书
教师竞聘演讲稿
2014/05/16 职场文书
售后服务承诺书怎么写
2014/05/21 职场文书
节能环保演讲稿
2014/08/28 职场文书
税务干部个人整改措施思想汇报
2014/10/10 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
慰问信格式
2015/02/14 职场文书