解决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进阶教程之函数对象(函数也是对象)
Aug 30 Python
利用Python实现图书超期提醒
Aug 02 Python
python 全文检索引擎详解
Apr 25 Python
Python引用传值概念与用法实例小结
Oct 07 Python
Python登录并获取CSDN博客所有文章列表代码实例
Dec 28 Python
python实现写数字文件名的递增保存文件方法
Oct 25 Python
对Python Pexpect 模块的使用说明详解
Feb 14 Python
python实现微信定时每天和女友发送消息
Apr 29 Python
Python Numpy 实现交换两行和两列的方法
Jun 26 Python
python 实现目录复制的三种小结
Dec 04 Python
pytorch 常用线性函数详解
Jan 15 Python
python小程序之4名牌手洗牌发牌问题解析
May 15 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
饭制《星际争霸》Mod:优化游戏机制 增加新单位
2017/07/02 星际争霸
php 文件夹删除、php清除缓存程序
2009/08/25 PHP
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
2011/11/10 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
uploadify 3.0 详细使用说明
2012/06/18 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
2013/07/05 Javascript
Jquery模仿Baidu、Google搜索时自动补充搜索结果提示
2013/12/26 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
jquery实现图片随机排列的方法
2015/05/04 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
Vue的MVVM实现方法
2017/08/16 Javascript
jQuery实现的简单动态添加、删除表格功能示例
2017/09/21 jQuery
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
教你使用python画一朵花送女朋友
2018/03/29 Python
详解python读取image
2019/04/03 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
如何通过Python实现RabbitMQ延迟队列
2020/11/28 Python
canvas 如何绘制线段的实现方法
2018/07/12 HTML / CSS
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
幼儿园园长岗位职责
2013/11/26 职场文书
国贸专业个人求职信分享
2013/12/04 职场文书
护理职业生涯规划书
2014/01/24 职场文书
医药销售自荐书
2014/05/29 职场文书
施工安全责任书范本
2014/07/24 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书