解决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+Opencv识别两张相似图片
Mar 23 Python
python制作websocket服务器实例分享
Nov 20 Python
python递归查询菜单并转换成json实例
Mar 27 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
python多线程并发实例及其优化
Jun 27 Python
python设置环境变量的作用和实例
Jul 09 Python
django和vue实现数据交互的方法
Aug 21 Python
python标识符命名规范原理解析
Jan 10 Python
使用Tensorflow实现可视化中间层和卷积层
Jan 24 Python
TensorFlow实现自定义Op方式
Feb 04 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
Mar 10 Python
python函数map()和partial()的知识点总结
May 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
php Memcache 中实现消息队列
2009/11/24 PHP
php实现的简单检验登陆类
2015/06/18 PHP
Thinkphp关闭缓存的方法
2015/06/26 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
javascript动态加载实现方法一
2012/08/22 Javascript
jQuery中prev()方法用法实例
2015/01/08 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
浅析JS动态创建元素【两种方法】
2016/04/20 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
Web打印解决方案之普通报表打印功能
2016/08/29 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
CentOS中使用virtualenv搭建python3环境
2015/06/08 Python
Django实现快速分页的方法实例
2017/10/22 Python
Python装饰器语法糖
2019/01/02 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
python requests使用socks5的例子
2019/07/25 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
python网络爬虫 Scrapy中selenium用法详解
2019/09/28 Python
Python根据字典的值查询出对应的键的方法
2020/09/30 Python
如何用python 操作zookeeper
2020/12/28 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
波兰最大的宠物用品网上商店:FERA.PL
2019/08/11 全球购物
水利公司纪检监察自我鉴定
2014/02/25 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
卫生院艾滋病宣传活动小结
2014/07/09 职场文书
试用期转正后的自我评价
2014/09/21 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
详解MySQL集群搭建
2021/05/26 MySQL
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS