因为工作上的需求,需要将PDF转成图片,在网络上寻找了一些PDF转图片的方法,但是如若想要免费使用的话,限制太多,如:限制转换页数,像素过低等,干脆考虑使用python程序来实现一个批量转化PDF的操作。
先介绍下程序具有的功能:在文件夹当中,自动识别PDF文件,然后会在该文件夹下面生成与PDF文件同名的文件夹,并将PDF转化之后的图片存入同名文件夹内;同时可以调整生成的图片缩放比例(XY两轴),对图片进行任意角度的旋转。
首先,我们需要安装fitz库用于操作PDF:
pip install PyMuPDF # 对的,没看错,安装的是PyMuPDF
利用os模块,获取程序当前路径所在的所有文件,包括文件夹:
file_names = os.listdir() # 获取程序当前路径所在的所有文件
# 遍历所有文件,如果含有pdf后缀名,将其加入到pdf_files列表
for i in range(len(file_names)):
if ".pdf" in file_names[i]:
pdf_files.append(file_names[i])
再对所有pdf文件进行遍历,如果不存在该文件夹,则利用split方法截取其名称(舍掉“.pdf”后缀):
for pdf_name in pdf_files:
new_full_name = pdf_name.split(".")[0] # 只要名称,不要后缀
doc = fitz.open(pdf_name) # 打开一个PDF文件,doc为Document类型,是一个包含每一页PDF文件的列表
rotate = int(0) # 设置图片的旋转角度
zoom_x = 2 # 设置图片相对于PDF文件在X轴上的缩放比例
zoom_y = 2 # 设置图片相对于PDF文件在Y轴上的缩放比例
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
我们利用fitz模块打开了一个pdf文件,他是一个Document对象,可使用print打印其查看,关于rotate (旋转参数)和XY轴的缩放系数zoom_x 和zoom_y 我是按照自己的要求进行设置,如果有需要可以修改参数自定义。
接下来再取出pdf每一页将其转化为光栅文件(btw,我也不太懂这个操作)进行输出就可以了:
for page in range(doc.pageCount): # doc.pageCount->获取PDF的页数
which_page = doc[page]
pm = which_page.getPixmap(matrix=trans, alpha=False) # 将其转化为光栅文件(位数)
new_full_name = pdf_name.split(".")[0] # 保证输出的文件名不变
pm.writeImage(new_full_name + "/" + new_full_name + "_" + str(page+1) + ".png") # 该方法只支持输出png,当然如果重命名为jpg也是可以的,但实际还是png
完整源代码
#-*- coding:utf8 -*-
import os
import fitz # 导入的是fitz
def getFilefolderPdf():
pdf_files = []
file_names = os.listdir()
for i in range(len(file_names)):
if ".pdf" in file_names[i]:
pdf_files.append(file_names[i])
print(f"This filefolder pdf file: {pdf_files}")
return pdf_files
def processPdf():
for pdf_name in getFilefolderPdf(): # 遍历每一个PDF文件
doc = fitz.open(pdf_name) # 打开一个PDF文件,doc为Document类型,是一个包含每一页PDF文件的列表
rotate = int(0) # 设置图片的旋转角度
zoom_x = 2 # 设置图片相对于PDF文件在X轴上的缩放比例
zoom_y = 2 # 设置图片相对于PDF文件在Y轴上的缩放比例
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
for page in range(doc.pageCount): # doc.pageCount->获取PDF的页数
which_page = doc[page]
pm = which_page.getPixmap(matrix=trans, alpha=False) # 将其转化为光栅文件(位数)
new_full_name = pdf_name.split(".")[0] # 保证输出的文件名不变
if not os.path.exists(new_full_name):
os.makedirs(new_full_name)
pm.writeImage(new_full_name + "/" + new_full_name + "_" + str(page+1) + ".png") # 该方法只支持输出png,当然如果重命名为jpg也是可以的,但实际还是png
print(f"{pdf_name} is transferred completed, browse {new_full_name} filefolder please!")
if __name__ == '__main__':
processPdf()