python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python PDF转图片

Python脚本实现将PDF批量转换为图片

作者:清山博客

本文演示了Python如何利用PyMuPDF(fitz)库,以200dpi质量逐页渲染PDF为PNG图片,自动命名保存,并显示转换进度,无论你是想批量处理PDF文件还是提取图表,这个Python脚本都能帮你轻松实现PDF转图片的需求

前言

这段Python代码演示了如何将PDF文件转换为图片。代码使用PyMuPDF(fitz)库,将指定PDF的每一页以200dpi的高质量渲染为PNG图片,并按页码顺序命名保存到输出目录。程序会显示转换进度,包括每页的尺寸,最后汇总转换的页数和输出文件列表。

主要步骤包括:设置输入/输出路径、创建输出目录、逐页渲染图片并保存、输出转换结果统计 

完整代码

import fitz
import os

BASE_DIR = r'c:\Users\zhang\Desktop\demo'
PDF_PATH = os.path.join(BASE_DIR, 'document.pdf')
OUTPUT_DIR = os.path.join(BASE_DIR, 'document_images')

# 创建输出目录
os.makedirs(OUTPUT_DIR, exist_ok=True)

print(f'=== PDF转图片 ===')
print(f'输入文件: {PDF_PATH}')
print(f'输出目录: {OUTPUT_DIR}')
print()

# 打开PDF
doc = fitz.open(PDF_PATH)
print(f'PDF页数: {len(doc)}')
print()

# 逐页转换
for page_num in range(len(doc)):
    page = doc[page_num]
    
    # 渲染为图片 (dpi=200 保证高质量)
    pix = page.get_pixmap(dpi=200)
    
    # 生成文件名
    output_path = os.path.join(OUTPUT_DIR, f'page_{page_num + 1:03d}.png')
    
    # 保存图片
    pix.save(output_path)
    
    print(f'  第 {page_num + 1} 页 -> {os.path.basename(output_path)} ({pix.width}x{pix.height})')

page_count = len(doc)
doc.close()

print()
print('=== 完成 ===')
print(f'共转换 {page_count} 页,图片保存在: {OUTPUT_DIR}')

# 验证生成的文件
output_files = sorted([f for f in os.listdir(OUTPUT_DIR) if f.endswith('.png')])
print(f'生成的文件: {output_files}')

知识扩展

python将pdf转换图片

# -*- coding:utf-8 -*-
# Author :  yyzhang56
# 所有的图片与PDF转换的操作都在这里进行定义
from multiprocessing import Pool
# 安装fitz需要安装PyMuPDF才能使用
import fitz
import os
tmp = r'C:\Users\Downloads\'   #pdf路径
export_file=r"D:\new_dates\数据"
save_path=r"D:\new_dates\ocr_result"
os.makedirs(export_file,exist_ok=True)
pdf_dir = [i for i in os.listdir(tmp) if os.path.splitext(i)[-1] == ".pdf"]
def pdf_to_jpg(name):
    # lock.acquire()
    #拼接pdf的文件路径
    pwd_name=os.path.join(tmp,name)
    doc=fitz.open(pwd_name)
    # 将文件名同我们的保存路径拼接起来(保存图片的文件夹)
    dir_name=os.path.splitext(name)[0]
    pdf_name = os.path.join(export_file,  dir_name)
    # print(pdf_name)
    temp = 0
    #(保存图片的文件夹)不存咋则生成
    # exsitsdir.judge(pdf_name)
    os.makedirs(pdf_name,exist_ok=True)
    for pg in range(doc.pageCount):
        page = doc[pg]
        temp += 1
        rotate = int(0)
        # 每个尺寸的缩放系数为2,这将为我们生成分辨率提高四倍的图像。
        zoom_x = 2.0
        zoom_y = 2.0
        trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
        pm = page.getPixmap(matrix=trans, alpha=False)
        pic_name = '{}.jpg'.format(temp)
        #拼接生成pdf的文件路径
        pic_pwd = os.path.join(pdf_name, pic_name)
        # print(pic_pwd)
        pm.writePNG(pic_pwd)
def main():
    pool = Pool(10)
    for i in pdf_dir:
        res = pool.apply_async(pdf_to_jpg, (i,))
    pool.close()
    pool.join()
if __name__ == '__main__':
    main()       #需要pdf切图就开启

图片转pdf

#Author:yyzhang56
from PIL import Image
import os
from PyPDF2 import PdfFileReader, PdfFileWriter
# 单张图片转pdf
# img = Image.open('优化.png')
# img.save('pypdf01.pdf', 'PDF')  # 通过PIL库保存为pdf格式
# 多张图片转pdf
# ilst = ['D:/docOfStu/pypdf2-mindmap-01.jpg', 'D:/docOfStu/pypdf2-mindmap-02.jpg']  # 图片列表
path=r"C:\Users\Desktop\pdf\tif_pic"
ilst=os.listdir(path)
out_pdf = PdfFileWriter()
sdfs=[os.path.join(path,i) for i in ilst ]
print(sdfs)
for f in sdfs:
    img = Image.open(f)
    fw = f.replace('.png', '.pdf')
    img.save(fw)
    out_pdf.appendPagesFromReader(PdfFileReader(
        open(fw, 'rb')))  # 也可拆这句为 sc_pdf=PdfFileReader(open(fw,'rb')); out_pdf.addPage(sc_pdf.getPage(0))
out_pdf.write(open('./pypdf2.pdf', 'wb'))

pdf转docx

import os
from pdf2docx import Converter
'''
author--yyzhang
'''
pdf_path = r"C:\Users\Desktop\pdf\files"  # pdf路径
docx_path = r"C:\Users\Desktop\pdf\docx"  # 保存docx路径
# 如果保存的路径不存在可以自动生成
if os.path.exists(docx_path):
    pass
else:
    os.makedirs(docx_path)
pdf_files = os.listdir(pdf_path)
# 遍历pdf路径下的文件
for pdf_file in pdf_files:
    if pdf_file.endswith(".pdf") or pdf_file.endswith(".PDF"):
        head_name = os.path.splitext(pdf_file)[0]   #获取文件名
        docx_name = head_name + ".docx"             #创建docx名称
        file_path = os.path.join(pdf_path, pdf_file)    #获取pdf绝对路径
        docx_file_path = os.path.join(docx_path, docx_name)   #获取docx绝对路径
        cv = Converter(file_path)
        cv.convert(docx_file_path, start=0, end=None)
        cv.close()

python小脚本批量将PDF文件转换成图片

用法:选择PDF文件所在的目录,点击 确定 后,自动将该目录下的所有PDF转换成单个图片,图片名称为:   pdf文件名.page_序号.jpg

如运行中报错,需要自行根据报错内容按照缺失的库

例如:

#安装库
pip install pyautogui
#安装库
pip install  pillow

这里提供两种源码,第一种是在代码中手动添加pdf所在目录

import os
import glob
from PyPDF2 import PdfReader
from pdf2image import convert_from_path
pdf_dir = "path/to/pdf_dir/"  #pdf目录
# 遍历目录中的PDF文件
pdf_files = glob.glob(os.path.join(pdf_dir, "*.pdf"))
# 遍历每个PDF文件,并将其转换为图片
for pdf_file in pdf_files:
    # 创建PdfReader对象
    pdf = open(pdf_file, 'rb')
    pdf_reader = PdfReader(pdf)
    # 遍历PDF的页面并将其转换为图片
    for page_num in range(len(pdf_reader.pages)):
        # 获取页面对象
        page = pdf_reader.pages[page_num]
        # 将PDF页面转换为图像
        images = convert_from_path(pdf_file, first_page=page_num+1, last_page=page_num+1)
        # 定义图像保存路径
        filename = os.path.splitext(os.path.basename(pdf_file))[0]
        image_path = os.path.join(pdf_dir, f"{filename}_page_{page_num+1}.jpg")
        # 保存图像
        for i, image in enumerate(images):
            if i == 0:
                image.save(image_path, "JPEG")
            else:
                image_path = os.path.join(pdf_dir, f"{filename}_page_{page_num+1}_{i+1}.jpg")
                image.save(image_path, "JPEG")
    # 关闭PDF文件
    pdf.close()

第二种是点击运行后,弹出窗口选择PDF所在文件夹,程序运行对该文件夹下的所有PDF文件转换成图片

#手动选择目录下的pdf文件
import os
from tkinter import Tk
from tkinter.filedialog import askdirectory
from PyPDF2 import PdfReader
from pdf2image import convert_from_path
# 打开选择目录的对话框
Tk().withdraw()  # 隐藏Tkinter根窗口
pdf_dir = askdirectory(title="选择PDF所在目录")
# 遍历目录中的PDF文件
pdf_files = [f for f in os.listdir(pdf_dir) if f.endswith(".pdf")]
# 遍历每个PDF文件,并将其转换为图片
for pdf_file in pdf_files:
    # 创建PdfReader对象
    pdf_path = os.path.join(pdf_dir, pdf_file)
    pdf = open(pdf_path, 'rb')
    pdf_reader = PdfReader(pdf)
    # 遍历PDF的页面并将其转换为图片
    for page_num in range(len(pdf_reader.pages)):
        # 获取页面对象
        page = pdf_reader.pages[page_num]
        # 将PDF页面转换为图像
        images = convert_from_path(pdf_path, first_page=page_num+1, last_page=page_num+1)
        # 定义图像保存路径
        filename = os.path.splitext(pdf_file)[0]
        image_path = os.path.join(pdf_dir, f"{filename}_page_{page_num+1}.jpg")
        # 保存图像
        for i, image in enumerate(images):
            if i == 0:
                image.save(image_path, "JPEG")
            else:
                image_path = os.path.join(pdf_dir, f"{filename}_page_{page_num+1}_{i+1}.jpg")
                image.save(image_path, "JPEG")
    # 关闭PDF文件
    pdf.close()

到此这篇关于Python脚本实现将PDF批量转换为图片的文章就介绍到这了,更多相关Python PDF转图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文