解决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的Django框架中消息通知的计数器实现教程
Jun 13 Python
Python中生成器和迭代器的区别详解
Feb 10 Python
在Pycharm中设置默认自动换行的方法
Jan 16 Python
Python实现统计英文文章词频的方法分析
Jan 28 Python
python处理DICOM并计算三维模型体积
Feb 26 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
Aug 02 Python
Python语言异常处理测试过程解析
Jan 08 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
Mar 09 Python
pytorch随机采样操作SubsetRandomSampler()
Jul 07 Python
python中spy++的使用超详细教程
Jan 29 Python
Python爬虫之爬取最新更新的小说网站
May 06 Python
用Python监控你的朋友都在浏览哪些网站?
May 27 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
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
PHP生成唯一的促销/优惠/折扣码(附源码)
2012/12/28 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
jQuery maxlength文本字数限制插件
2010/04/16 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
JS的document.all函数使用示例
2013/12/30 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
查找页面中所有类为test的结点的方法
2014/03/28 Javascript
JS比较2个日期间隔的示例代码
2014/04/15 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
javascript感应鼠标图片透明度显示的方法
2015/02/24 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
微信小程序开发中的疑问解答汇总
2017/07/03 Javascript
详解vue-cli快速构建vue应用并实现webpack打包
2017/12/13 Javascript
Angular angular-file-upload文件上传的示例代码
2018/08/23 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
python自然语言编码转换模块codecs介绍
2015/04/08 Python
使用Python将数组的元素导出到变量中(unpacking)
2016/10/27 Python
python绘制立方体的方法
2018/07/02 Python
Selenium的使用详解
2018/10/19 Python
Python使用sklearn库实现的各种分类算法简单应用小结
2019/07/04 Python
pandas条件组合筛选和按范围筛选的示例代码
2019/08/26 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
JAVA和C++区别都有哪些
2015/03/30 面试题
2014年清明节寄语
2014/04/03 职场文书
市场拓展计划书
2014/05/03 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
哪类餐饮行业,最适合在高校创业?
2019/08/19 职场文书
python3 hdf5文件 遍历代码
2021/05/19 Python
十大最强妖精系宝可梦,哲尔尼亚斯实力最强,第五被称为大力士
2022/03/18 日漫