解决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 获取新浪微博的最新公共微博实例分享
Jul 03 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
python多线程并发实例及其优化
Jun 27 Python
画pytorch模型图,以及参数计算的方法
Aug 17 Python
python tkinter canvas使用实例
Nov 04 Python
tensorflow 限制显存大小的实现
Feb 03 Python
TensorFlow实现自定义Op方式
Feb 04 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
Jun 08 Python
Python Django中间件使用原理及流程分析
Jun 13 Python
基于Python爬取股票数据过程详解
Oct 21 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 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 咖啡文化
phpword插件导出word文件时中文乱码问题处理方案
2014/08/19 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
PHP实现腾讯短网址生成api接口实例
2020/12/08 PHP
jquery 简单的进度条实现代码
2010/03/11 Javascript
用JQuery实现全选与取消的两种简单方法
2014/02/22 Javascript
让angularjs支持浏览器自动填表
2014/11/10 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
2015/03/26 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
2016/11/10 Javascript
浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序
2017/02/19 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
js中apply与call简单用法详解
2017/11/06 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
nodejs 使用http进行post或get请求的实例(携带cookie)
2019/01/03 NodeJs
javascript设计模式 ? 备忘录模式原理与用法实例分析
2020/04/21 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
Vue封装全局过滤器Filters的步骤
2020/09/16 Javascript
Python的函数嵌套的使用方法
2014/01/24 Python
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
浅谈图像处理中掩膜(mask)的意义
2020/02/19 Python
Python MOCK SERVER moco模拟接口测试过程解析
2020/04/13 Python
python3.7调试的实例方法
2020/07/21 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
纽约香氛品牌:NEST Fragrance
2018/10/15 全球购物
在线课程:Skillshare
2019/04/02 全球购物
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
党员学习群众路线教育实践活动对照检查材料
2014/09/23 职场文书
委托证明范本
2014/11/25 职场文书
区域经理岗位职责
2015/02/02 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
申请吧主发表的感言
2015/08/03 职场文书
python - asyncio异步编程
2021/04/06 Python
goland设置颜色和字体的操作
2021/05/05 Golang
如何理解python接口自动化之logging日志模块
2021/06/15 Python
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript