昨天有一个突发的需求,要求尽快的把一个一百多页的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方法小结相关推荐

  1. python datetime模块-Python datetime模块使用方法小结

    datetime模块 当前日期 datetime.date.today() datetime.date(2020, 4, 24) 转换元祖 >>> datetime.date.tim ...

  2. python遍历数组的方法小结

    这篇文章主要介绍了python遍历数组的方法,实例总结了两种Python遍历数组的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例总结了python遍历数组的方法.分享给大家供大家参考.具体分析 ...

  3. python常用文本处理方法小结

    A B C 1 迭代器计数' 'collections.Counter() collections.Counter()是一个计数器,可以用来计数一个迭代器(字符串,列表,set)中每个字符出现的次数 ...

  4. python调用shell命令-python中执行shell命令的几个方法小结

    最近有个需求就是页面上执行shell命令,第一想到的就是os.system, 复制代码 代码如下: os.system('cat /proc/cpuinfo') 但是发现页面上打印的命令执行结果 0或 ...

  5. 使用python进行数据清洗常用的库_python3常用的数据清洗方法(小结)

    首先载入各种包: import pandas as pd import numpy as np from collections import Counter from sklearn import ...

  6. python输出矩阵的转置_Python 矩阵转置的几种方法小结

    我就废话不多说了,直接上代码吧! #Python的matrix转置 matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] def printmatrix(m): fo ...

  7. python csv读写方法_python中csv文件的若干读写方法小结

    如下所示: //用普通文本文件方式打开和操作 with open("'file.csv'") as cf: lines=cf.readlines() ...... //用普通文本方 ...

  8. python处理字典的方法_python字典的常用操作方法小结

    Python字典是另一种可变容器模型(无序),且可存储任意类型对象,如字符串.数字.元组等其他容器模型.本文章主要介绍Python中字典(Dict)的详解操作方法,包含创建.访问.删除.其它操作等,需 ...

  9. python数据生成pdf,Python生成pdf文件的方法

    摘要:这篇Python开发技术栏目下的"Python生成pdf文件的方法",介绍的技术点是"python生成pdf文件.python生成pdf.生成pdf文件.Pytho ...

  10. python安装到桌面的路径是什么_Python 获取windows桌面路径的5种方法小结

    这里介绍了5中python获取window桌面路径的方法,获取这个路径有什么用呢?一般是将程序生成的文档输出到桌面便于查看编辑. 前两个方法是通过注册表来获取当前windows桌面绝对路径,比较推荐使 ...

最新文章

  1. centos 7防火墙
  2. openresty开发系列23--lua面向对象
  3. log4net环境配置
  4. rhel5.5下安装awstats实现网站流量监控
  5. zookeeper watch笔记
  6. publiccms实现首页菜单栏下拉的方法
  7. beam search算法
  8. SharePoint要在master page中动态显示List数据的几种方式
  9. 接入上文,StarWind V2V Image Converter:虚拟机镜像转换工具,如何使用转化之后的 VMware VMDK 文件
  10. BugkuCTF-MISC题split
  11. AptanaStudio3+PHP程序远程调试的方法和步骤
  12. Error parsing XML: not well-formed (invalid token)
  13. Python AttributeError: 'module' object has no attribute 'posseg'
  14. C MySql封装类 高性能连接池_在vc中通过连接池操作mysql(api方式),附c++访问mysql的封装类...
  15. MySQL8安装,初始化,登录和修改密码
  16. python培训多久能入职_Python学到什么程度可以面试工作?
  17. 光圈和景深对摄影的影响
  18. 富文本编辑器 可全屏可粘贴(只能单独粘贴图片或文字)
  19. (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  20. Kotlin中问号 ? 和两个叹号 !! 的含义

热门文章

  1. mPush实战笔记5完整测试
  2. OSEK Os的任务调度
  3. teststand-介绍
  4. 如何通过Tik Tok月入2w美金
  5. 少量代码完成火山图绘制
  6. 连接服务器显示用户账户无效,发现MT4真实账户无效该怎么办?
  7. python完成滑动拼图验证码破解
  8. 微信php开发实例,微信小程序php后端开发实例
  9. 23种设计模式JAVA案例
  10. 考勤系统怎样登录服务器,ZKADMS考勤管理系统数据库连接步骤