YOLO813

python批量将PDF分割后转成图片

    因为工作上的需求,需要将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()