解决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 相关文章推荐
django实现分页的方法
May 26 Python
Windows下Python使用Pandas模块操作Excel文件的教程
May 31 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
Dec 15 Python
Python2.7环境Flask框架安装简明教程【已测试】
Jul 13 Python
使用Python生成200个激活码的实现方法
Nov 22 Python
python输出数组中指定元素的所有索引示例
Dec 06 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
如何表示python中的相对路径
Jul 08 Python
详解python metaclass(元类)
Aug 13 Python
Python爬取科目四考试题库的方法实现
Mar 30 Python
解决pytorch-gpu 安装失败的记录
May 24 Python
详解在OpenCV中如何使用图像像素
Mar 03 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
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
php实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
2018/07/30 PHP
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
JavaScript Timer实现代码
2010/02/17 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
jQuery实现返回顶部效果的方法
2015/05/29 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
jQuery.Uploadify插件实现带进度条的批量上传功能
2016/06/08 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
2016/11/04 Javascript
Node.js 实现简单小说爬虫实例
2016/11/18 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
p5.js入门教程之键盘交互
2018/03/19 Javascript
微信网页授权并获取用户信息的方法
2018/07/30 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
ES6知识点整理之Proxy的应用实例详解
2019/04/16 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
详解django.contirb.auth-认证
2018/07/16 Python
Python 3.6 -win64环境安装PIL模块的教程
2019/06/20 Python
python的移位操作实现详解
2019/08/21 Python
CSS3 @keyframes简单动画实现
2018/02/24 HTML / CSS
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
如何现实servlet的单线程模式
2014/08/05 面试题
2014年信访工作总结
2014/11/17 职场文书
项目备案申请报告
2015/05/15 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书
教你如何使用Python实现二叉树结构及三种遍历
2021/06/18 Python