解决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的Tornado框架实现数据可视化的教程
May 02 Python
详解python 发送邮件实例代码
Dec 22 Python
Django中Model的使用方法教程
Mar 07 Python
Python3实现的简单验证码识别功能示例
May 02 Python
Python常见数据结构之栈与队列用法示例
Jan 14 Python
Python 数据库操作 SQLAlchemy的示例代码
Feb 18 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
Dec 06 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
Apr 08 Python
jupyter lab文件导出/下载方式
Apr 22 Python
Python参数传递实现过程及原理详解
May 14 Python
基于Python的身份证验证识别和数据处理详解
Nov 14 Python
Python基础之元类详解
Apr 29 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
要会喝咖啡也要会知道咖啡豆
2021/03/03 咖啡文化
社区(php&&mysql)六
2006/10/09 PHP
PHP优于Node.js的五大理由分享
2012/09/15 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
改写一个简单的菜单 弹性大小
2010/12/02 Javascript
kmock javascript 单元测试代码
2011/02/06 Javascript
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
JavaScript中双叹号!!作用示例介绍
2014/09/21 Javascript
JavaScript 面向对象与原型
2015/04/10 Javascript
js实现表单及时验证功能 用户信息立即验证
2016/09/13 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
微信小程序 商城开发(ecshop )简单实例
2017/04/07 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
webpack配置proxyTable时pathRewrite无效的解决方法
2018/12/13 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
[01:54]TI珍贵瞬间系列(三):翻盘
2020/08/28 DOTA
Django Aggregation聚合使用方法解析
2019/08/01 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
Django上线部署之IIS的配置方法
2019/08/22 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
怎样比较两个类型为String的字符串
2016/08/17 面试题
机械设计制造专业个人求职信
2013/09/25 职场文书
应届生求职推荐信
2013/10/28 职场文书
五年级音乐教学反思
2014/02/06 职场文书
加入学生会演讲稿
2014/04/24 职场文书
安全环保演讲稿
2014/08/28 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS