python 将pdf转换为图片

这里借用腾讯云开发者社区的办法,需要详细的请直接访问

查询 PyMuPDF版本对应的解释器版本

版本查询传送门

需要安装相关包

pip3 install PyMuPDF
## pip install fitz
## 3.6的解释器,需要指定版本,如果安装最新的PyMuPDF会报错,安装不上,需要指定版本,演示版本用的python 3.9 PyMuPDF用的1.25.5
pip3 install PyMuPDF==1.22.0

将pdf每一页都转为图片

import os
import fitz


def covert2pic(file_path, zoom, png_path):
    doc = fitz.open(file_path)
    total = doc.page_count
    for pg in range(total):
        page = doc[pg]
        zoom = int(zoom)  # 值越大,分辨率越高,文件越清晰
        rotate = int(0)

        trans = fitz.Matrix(zoom / 100.0, zoom / 100.0).prerotate(rotate)
        pm = page.get_pixmap(matrix=trans, alpha=False)
        if not os.path.exists(png_path):
            os.mkdir(png_path)
        save = os.path.join(png_path, '%s.png' % (pg + 1))
        pm.save(save)
    doc.close()


if __name__ == "__main__":
    pdfPath = './img/demo.pdf'
    imagePath = './img'
    covert2pic(pdfPath, 1000, imagePath)

将pdf每一页都转为图片 然后合并成横图

import fitz  # PyMuPDF
from PIL import Image


def pdf_to_image(pdf_path, output_image_path, zoom=5.0):
    # 打开PDF文件
    pdf_document = fitz.open(pdf_path)

    # 计算总宽度和最大高度
    total_width = 0
    max_height = 0
    images = []

    # 遍历每一页
    for page_num in range(len(pdf_document)):
        page = pdf_document.load_page(page_num)
        # 创建一个矩阵来放大图像
        matrix = fitz.Matrix(zoom, zoom)  # 设置放大倍数
        pix = page.get_pixmap(matrix=matrix)  # 获取放大后的页面像素图
        img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)

        images.append(img)
        total_width += img.width
        max_height = max(max_height, img.height)

    # 创建一个新的图像,宽度为所有页面宽度之和,高度为最大高度
    combined_image = Image.new("RGB", (total_width, max_height))

    # 将每一页的图像粘贴到新图像中
    current_x = 0
    for img in images:
        combined_image.paste(img, (current_x, 0))  # 横着粘贴
        current_x += img.width

    # 保存最终的合并图像
    combined_image.save(output_image_path)


if __name__ == '__main__':
    # 使用示例
    pdf_path = "./img/demo.pdf"  # 输入的PDF文件路径
    output_image_path = "output_image.png"  # 输出的图像文件路径
    pdf_to_image(pdf_path, output_image_path)

将pdf每一页都转为图片 然后合并成竖图

import fitz  # PyMuPDF
from PIL import Image


def pdf_to_vertical_image(pdf_path, output_image_path):
    '''
    不指定像素,比较模糊
    :param pdf_path: pdf路径
    :param output_image_path: 保存的文件名和路径
    :return:
    '''
    # 打开PDF文件
    pdf_document = fitz.open(pdf_path)

    # 计算最大宽度和总高度
    max_width = 0
    total_height = 0
    images = []

    # 遍历每一页
    for page_num in range(len(pdf_document)):
        page = pdf_document.load_page(page_num)
        pix = page.get_pixmap()  # 获取页面的像素图
        img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)

        images.append(img)
        max_width = max(max_width, img.width)  # 记录最大宽度
        total_height += img.height  # 计算总高度

    # 创建一个新的图像,宽度为最大宽度,高度为所有页面高度之和
    combined_image = Image.new("RGB", (max_width, total_height))

    # 将每一页的图像粘贴到新图像中
    current_y = 0
    for img in images:
        combined_image.paste(img, (0, current_y))  # 竖着粘贴
        current_y += img.height  # 更新当前的y坐标

    # 保存最终的合并图像
    combined_image.save(output_image_path)


def pdf_to_vertical_image2(pdf_path, output_image_path, zoom=10.0):
    '''
    指定像素使文件更清晰
    :param pdf_path:
    :param output_image_path:
    :param zoom: zoom=1.0 表示原始分辨率,zoom=2.0 通常会将图像分辨率提高到两倍,从而提高清晰度。
    可以尝试更高的值(如 3.0 或 4.0),但请注意,这会导致生成的图像文件大小显著增加。
    较高的 zoom 值会导致处理时间延长以及更大的输出图像文件
    :return:
    '''
    # 打开PDF文件
    pdf_document = fitz.open(pdf_path)

    # 计算最大宽度和总高度
    max_width = 0
    total_height = 0
    images = []

    # 遍历每一页
    for page_num in range(len(pdf_document)):
        page = pdf_document.load_page(page_num)

        # 创建一个矩阵来放大图像
        matrix = fitz.Matrix(zoom, zoom)  # 设置放大倍数
        pix = page.get_pixmap(matrix=matrix)  # 获取放大后的页面像素图
        img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)

        images.append(img)
        max_width = max(max_width, img.width)  # 记录最大宽度
        total_height += img.height  # 计算总高度

    # 创建一个新的图像,宽度为最大宽度,高度为所有页面高度之和
    combined_image = Image.new("RGB", (max_width, total_height))

    # 将每一页的图像粘贴到新图像中
    current_y = 0
    for img in images:
        combined_image.paste(img, (0, current_y))  # 竖着粘贴
        current_y += img.height  # 更新当前的y坐标

    # 保存最终的合并图像
    combined_image.save(output_image_path)


if __name__ == '__main__':
    # 使用示例
    pdf_path = "./img/demo.pdf"  # 输入的PDF文件路径
    output_image_path = "output_image1.png"  # 输出的图像文件路径
    pdf_to_vertical_image2(pdf_path, output_image_path)

posted @ 2025-04-27 15:26  darling331  阅读(105)  评论(0)    收藏  举报