解决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正则表达式操作指南(re使用)
Sep 06 Python
python处理cookie详解
Feb 07 Python
Python中的字典与成员运算符初步探究
Oct 13 Python
教大家使用Python SqlAlchemy
Feb 12 Python
python 判断是否为正小数和正整数的实例
Jul 23 Python
python3实现SMTP发送邮件详细教程
Jun 19 Python
对Python使用mfcc的两种方式详解
Jan 09 Python
python实现维吉尼亚算法
Mar 20 Python
十分钟搞定pandas(入门教程)
Jun 21 Python
python内置模块collections知识点总结
Dec 19 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
Python3如何使用tabulate打印数据
Sep 25 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中目录,文件操作详谈
2007/03/19 PHP
php采集内容中带有图片地址的远程图片并保存的方法
2015/01/03 PHP
Stop SQL Server
2007/06/21 Javascript
JQuery 学习笔记 选择器之四
2009/07/23 Javascript
javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
2011/04/12 Javascript
再谈javascript面向对象编程
2012/03/18 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
jQuery中用on绑定事件时需注意的事项
2017/03/19 Javascript
JS将unicode码转中文方法
2017/05/08 Javascript
详解在vue-cli中使用路由
2017/09/25 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
解决Vue大括号字符换行踩的坑
2020/11/09 Javascript
[01:51]2014DOTA2西雅图邀请赛 MVP 外卡赛black场间采访
2014/07/09 DOTA
Python中的并发编程实例
2014/07/07 Python
详细介绍Python函数中的默认参数
2015/03/30 Python
基于Python函数的作用域规则和闭包(详解)
2017/11/29 Python
python中requests和https使用简单示例
2018/01/18 Python
python3实现基于用户的协同过滤
2018/05/31 Python
python获取代码运行时间的实例代码
2018/06/11 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
SmartBuyGlasses美国官网:太阳眼镜和眼镜
2017/08/20 全球购物
为女性购买传统的印度服装和婚纱:Kalkifashion
2019/07/22 全球购物
护士自我鉴定范文
2013/10/06 职场文书
法学函授自我鉴定
2014/02/06 职场文书
文秘求职信范文
2014/04/10 职场文书
秋天的图画教学反思
2014/05/01 职场文书
推荐信模板
2014/05/09 职场文书
教育合作协议范本
2014/10/17 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
HDFS免重启挂载新磁盘
2022/04/06 Servers