解决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类方法__init__和__del__构造、析构过程分析
Mar 06 Python
pygame学习笔记(3):运动速率、时间、事件、文字
Apr 15 Python
Python基于checksum计算文件是否相同的方法
Jul 09 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
Jan 18 Python
pyinstaller打包opencv和numpy程序运行错误解决
Aug 16 Python
Python语法垃圾回收机制原理解析
Mar 25 Python
pyinstaller将含有多个py文件的python程序做成exe
Apr 29 Python
python 串行执行和并行执行实例
Apr 30 Python
Python嵌入C/C++进行开发详解
Jun 09 Python
python 密码学示例——凯撒密码的实现
Sep 21 Python
Python类绑定方法及非绑定方法实例解析
Oct 09 Python
python+selenium实现12306模拟登录的步骤
Jan 21 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中SimpleXML函数用法分析
2014/11/26 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
2017/02/04 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
2019/03/11 PHP
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
文本框根据输入内容自适应高度的代码
2011/10/24 Javascript
JavaScript的漂亮的代码片段
2013/06/05 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
浅谈jQuery中replace()方法
2015/05/13 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
2017/04/18 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
javascript中的with语句学习笔记及用法
2020/02/17 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
2019/10/14 Python
python_array[0][0]与array[0,0]的区别详解
2020/02/18 Python
python 控制台单行刷新,多行刷新实例
2020/02/19 Python
Python数据可视化图实现过程详解
2020/06/12 Python
Python下载的11种姿势(小结)
2020/11/18 Python
办理退休介绍信
2014/01/09 职场文书
运动会稿件300字
2014/02/14 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
杜甫草堂导游词
2015/02/03 职场文书
闪闪的红星观后感
2015/06/08 职场文书
教师节领导致辞
2015/07/29 职场文书
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技
在容器中使用nginx搭建上传下载服务器
2022/05/11 Servers
docker 制作mysql镜像并自动安装
2022/05/20 Servers