解决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中用startswith()函数判断字符串开头的教程
Apr 07 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
python pandas 对时间序列文件处理的实例
Jun 22 Python
python3 实现对图片进行局部切割的方法
Dec 05 Python
python样条插值的实现代码
Dec 17 Python
Python爬虫学习之获取指定网页源码
Jul 30 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
python爬虫可以爬什么
Jun 16 Python
python pymysql库的常用操作
Oct 16 Python
matplotlib绘制多子图共享鼠标光标的方法示例
Jan 08 Python
pytorch中的model=model.to(device)使用说明
May 24 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
php set_magic_quotes_runtime() 函数过时解决方法
2010/07/08 PHP
php 截取字符串并以零补齐str_pad() 函数
2011/05/07 PHP
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
浅谈javascript中的作用域
2012/04/07 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
Js获取下拉框选定项的值和文本的实现代码
2014/02/26 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
基于jQuery实现搜索关键字自动匹配功能
2020/03/26 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
Javascript简单实现面向对象编程继承实例代码
2015/11/27 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
Vue CLI3中使用compass normalize的方法
2019/05/30 Javascript
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
vue实现移动端返回顶部
2020/10/12 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
Python File(文件) 方法整理
2019/02/18 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
win10下python2和python3共存问题解决方法
2019/12/23 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
详解Python 循环嵌套
2020/07/09 Python
python 模块导入问题汇总
2021/02/01 Python
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
京东国际站:JOYBUY
2017/11/23 全球购物
如何启动时不需输入用户名与密码
2014/05/09 面试题
竞选大队干部演讲稿
2014/09/11 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
总结一下关于在Java8中使用stream流踩过的一些坑
2021/06/24 Java/Android