Python PDF转image方法小结
昨天有一个突发的需求,要求尽快的把一个一百多页的pdf按照页码每页转换成一个jpg文件后打包传回。正好最近一直在学习Python就打算写一个这样的脚本(结果发现踩了坑)
Wand
【pypi - Wand】【Wand官网】【Github - Wand】pip install wand
在百度上找解决方案的时候,第一条用的就是wand. 后来去stackoverflow上看也有用wand来操作的,看起来也挺简单,代码如下:
from wand.image import Imagefilename="somefile.pdf"with(Image(filename=filename, resolution=120)) as source: images = source.sequencepages = len(images)for i in range(pages):n = i + 1newfilename = filename[:-4] + str(n) + '.jpeg'Image(images[i]).save(filename=newfilename)
上述代码把somefile.pdf转换成一张张图片,并分为存为somefile1.jpeg这样的图片。
但问题是,我在windows下运行的时候出现了这样的错误:
Traceback (most recent call last):File "test.py", line 1, in <module>from wand.image import ImageFile "C:\Program Files\Python\lib\site-packages\wand\image.py", line 18, in <module>from . import compatFile "C:\Program Files\Python\lib\site-packages\wand\compat.py", line 25, in <module>abc = collections.abc if PY3 else collectionsFile "C:\Program Files\Python\lib\collections\__init__.py", line 55, in __getattr__raise AttributeError(f'module {__name__!r} has no attribute {name!r}')
AttributeError: module 'collections' has no attribute 'abc'
翻看wand官网可以看到,wand和其他大部分类似库一样,都是包装接口(bindings),而实际进行转换的工具是ImageMagick. 【ImageMagick官网】【Github - ImageMagick】
在我写这篇文章的时候,我只打开过ImageMagick官网一次,剩下大部分时候都会超时。除了在ImageMagick官网上下载windows版本,Wand官网说在这里也能下载到windows版的ImageMagick。但实际上这个网站还是超时。
从ImageMagick仓库来看,官方在releases里没有提供windows版的build。但是从其CI日志看其实是在win平台上也测试并打包了。ImageMagick倒是支持在windows下编译,不过看了一下说明文档之后发现不仅不支持cmake,还需要先build一个configure程序然后再用configure生成sln编译库本体。
在Linux下,安装wand的时候会提示需要安装libmagickwand-dev。
如果脚本启动的时候报这样的错:wand.exceptions.PolicyError: not authorized somefile.pdf
,这不是wand的锅,这是ImageMagick默认配置的锅。解决方案是sudo vim /etc/ImageMagick-6/policy.xml
然后找到<policy domain="coder" right="none" pattern="PDF" />
这一行,将right="none"
修改为right="all"
即可。
pdf2image
【pypi - pdf2image 】【Github - pdf2image】pip install pdf2image
pdf2image也是个包装器,真正的转换工具是poppler。从这里下载poppler-utils的windows版. 右键另存为或者迅雷下载可能会出现一些问题,这里我只能用curl下载了(windows版本的curl去libcurl官网上就能下载到,虽然我是自己编译的)curl -O http://blog.alivate.com.au/wp-content/uploads/2018/10/poppler-0.68.0_x86.7z
解压之后把bin
目录加载到PATH
环境变量里(或者直接把bin目录下的文件都拖到当前文件夹里,用完再删了)
pdf2image用法如下:
from pdf2image import convert_from_path
convert_from_path('a.pdf', 500, "output",fmt="JPEG",output_file="ok",thread_count=4)
这会将a.pdf转换成在output文件夹下形如ok_线程id-页码.jpg
的一些文件。若不指定thread_count则默认为1,并且在文件名中显示id. 这种转换是直接写入到磁盘上的,因此不会占用太多内存。
还有一种写法是:
from pdf2image import convert_from_path
pages = convert_from_path('pdf_file', 500)
for page in pages:page.save('out.jpg', 'JPEG')
但这种写法会占用大量内存,因为convert_from_path
的默认格式是ppm,其次若不指定输出则默认是写入到内存中的。
在Linux下使用sudo apt install poppler-utils
来安装poppler,可能还需要安装pillow,使用pip install pillow
安装即可。
其他
除了使用现成的package,也可以通过“野路子”。比如选好一个工具,拼凑cmd命令,然后通过subprocess模块启动子进程进行转换,也是可以的。
目前除了wand和pdf2image还没发现比较好的包,以后如果发现更好的工具可能会更新。
最后推荐一个在线pdf转图片的网站:【PDF to JPG online converter - Convert PDF to JPG for FREE】如果pdf内容不要紧的话可以试试这个在线转换器,完全免费,对于多页结果还提供在线打包下载服务。
Python PDF转image方法小结相关推荐
- python datetime模块-Python datetime模块使用方法小结
datetime模块 当前日期 datetime.date.today() datetime.date(2020, 4, 24) 转换元祖 >>> datetime.date.tim ...
- python遍历数组的方法小结
这篇文章主要介绍了python遍历数组的方法,实例总结了两种Python遍历数组的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例总结了python遍历数组的方法.分享给大家供大家参考.具体分析 ...
- python常用文本处理方法小结
A B C 1 迭代器计数' 'collections.Counter() collections.Counter()是一个计数器,可以用来计数一个迭代器(字符串,列表,set)中每个字符出现的次数 ...
- python调用shell命令-python中执行shell命令的几个方法小结
最近有个需求就是页面上执行shell命令,第一想到的就是os.system, 复制代码 代码如下: os.system('cat /proc/cpuinfo') 但是发现页面上打印的命令执行结果 0或 ...
- 使用python进行数据清洗常用的库_python3常用的数据清洗方法(小结)
首先载入各种包: import pandas as pd import numpy as np from collections import Counter from sklearn import ...
- python输出矩阵的转置_Python 矩阵转置的几种方法小结
我就废话不多说了,直接上代码吧! #Python的matrix转置 matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] def printmatrix(m): fo ...
- python csv读写方法_python中csv文件的若干读写方法小结
如下所示: //用普通文本文件方式打开和操作 with open("'file.csv'") as cf: lines=cf.readlines() ...... //用普通文本方 ...
- python处理字典的方法_python字典的常用操作方法小结
Python字典是另一种可变容器模型(无序),且可存储任意类型对象,如字符串.数字.元组等其他容器模型.本文章主要介绍Python中字典(Dict)的详解操作方法,包含创建.访问.删除.其它操作等,需 ...
- python数据生成pdf,Python生成pdf文件的方法
摘要:这篇Python开发技术栏目下的"Python生成pdf文件的方法",介绍的技术点是"python生成pdf文件.python生成pdf.生成pdf文件.Pytho ...
- python安装到桌面的路径是什么_Python 获取windows桌面路径的5种方法小结
这里介绍了5中python获取window桌面路径的方法,获取这个路径有什么用呢?一般是将程序生成的文档输出到桌面便于查看编辑. 前两个方法是通过注册表来获取当前windows桌面绝对路径,比较推荐使 ...
最新文章
- centos 7防火墙
- openresty开发系列23--lua面向对象
- log4net环境配置
- rhel5.5下安装awstats实现网站流量监控
- zookeeper watch笔记
- publiccms实现首页菜单栏下拉的方法
- beam search算法
- SharePoint要在master page中动态显示List数据的几种方式
- 接入上文,StarWind V2V Image Converter:虚拟机镜像转换工具,如何使用转化之后的 VMware VMDK 文件
- BugkuCTF-MISC题split
- AptanaStudio3+PHP程序远程调试的方法和步骤
- Error parsing XML: not well-formed (invalid token)
- Python AttributeError: 'module' object has no attribute 'posseg'
- C MySql封装类 高性能连接池_在vc中通过连接池操作mysql(api方式),附c++访问mysql的封装类...
- MySQL8安装,初始化,登录和修改密码
- python培训多久能入职_Python学到什么程度可以面试工作?
- 光圈和景深对摄影的影响
- 富文本编辑器 可全屏可粘贴(只能单独粘贴图片或文字)
- (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
- Kotlin中问号 ? 和两个叹号 !! 的含义