将 PDF 转化为图片
遇到一个项目,需要将 PDF 文件的某一页 P 一张图片上去,我的思路为先将 PDF 文件转为图片,再把两张图片合成,再将合成好的图片转为 PDF,本文将分享如何将 PDF 文件转为图片。通过查资料除了 wand 我尝试过多种方法,但是其他方法貌似都是对 linux 的支持比较好,最后我用 wand 在 windows 上运行成功了。用到 python 的三个库:io、wand、PyPDF2,涉及 wand 中的 image 类、color 类,PyPDF2 中的中的 PdfFileReader、PdfFileWriter 类。
wand 库对于图片的处理功能还是比较强大的,wand 的 image 类依赖 ImageMagick,因此在使用 wand 之前我们需要先在电脑中安装 ImageMagick,ImageMagick 是一个免费的创建、编辑、合成图片的软件。这里我遇到两个坑:1.32 位、64 位的 python 与 32 位、64 位的 ImageMagick 兼容问题,大家在安装前先检查好自己的 python;2.python3 目前还不兼容 ImageMagick7 以上的版本,而 ImageMagick 的官网上下载不到 7 以下的版本,这里我把文件放在这里:c2f3a13453f14f06bfe7c29724da4d88_ImageMagick6.rar ,里边包含 6 版本的 32 位与 64 位的 ImageMagick。
就是以下报错信息困扰了我好久:
(这里完全看不出来是兼容性的问题 (┬_┬))
安装完成后,将 ImageMagic 添加到环境变量
以下为代码加注解:
import io
from wand.image import Image
from wand.color import Color
from PyPDF2 import PdfFileReader, PdfFileWriter
def pdf_convert(filename, page, res=120):
#初始化PdfFileReader对象
pdfile = PdfFileReader(filename, strict=False)
idx = page + 1
#从此PDF文件中按编号检索页面
pageObj = pdfile.getPage(page)
#创建PdfFileWriter对象,通常PdfFileReader生成的页面的情况下,用此对象编写PDF文件
dst_pdf = PdfFileWriter()
#在PdfFileWriter中添加页面,该页面通常从PdfFileReader实例获取
dst_pdf.addPage(pageObj)
#BytesIO实现了在内存中读写bytes,来操作二进制数据
pdf_bytes = io.BytesIO()
#将添加到此对象的页面集合作为PDF文件写出
dst_pdf.write(pdf_bytes)
#设置文件指针从0开始
pdf_bytes.seek(0)
#创建Image对象(支持with)将文件流传入(resolution为分辨率参数)
with Image(file=pdf_bytes, resolution=res) as img:
#img = Image(file=pdf_bytes, resolution=res)
#设置图片格式为png
img.format = 'png'
#img.compression_quality = 90
#设置背景颜色
img.background_color = Color("white")
#保存到当前路径并标记页码(rindex返回字符最后出现的位置)
img_path = '%s%d.png' % (filename[:filename.rindex('.')], idx)
#以此文件名保存图片
img.save(filename=img_path)
#img.destroy()
本代码实现了将一页 PDF 转化为图片,多页只需要加循环修改 page 的值即可。
有问题欢迎大家交流,有不足的地方欢迎大家指正。
另附:
PdfFileReader 文档:https://pythonhosted.org/PyPDF2/PdfFileReader.html
PdfFileWriter 文档:https://pythonhosted.org/PyPDF2/PdfFileWriter.html
wand.image 文档:http://docs.wand-py.org/en/latest/wand/image.html
👍👍,学习,多分享啊 😊