pdf 转图片 fitz、PyMuPDF

  • Post author:
  • Post category:其他


pdf转化图片使用的是fitz模块,而fitz是pymupdf的子模块。

代码中import fitz导入模块就需要提前安装三方包pymupdf,比如通过清华镜像源安装:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/  PyMuPDF==1.18.14

# -*- coding: utf-8 -*-
# pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/  PyMuPDF==1.18.14


import fitz

import glob
import datetime
import os

def pyMuPDF_fitz(pdfPath, imagePath, count):
    pdfDoc = fitz.open(pdfPath)    # 打开文档
    pageCount = pdfDoc.page_count  # 获得PDF页码数量
    for i in range(pageCount):   # 逐页读取PDF
        page = pdfDoc[i]

        # 设置缩放zoom和旋转系数rotate
        # zoom_x, zoom_y取相同值,表示等比例缩放

        rotate = int(0)
        zoom_x = 4
        zoom_y = 4

        # 使用matrix参数来控制输出图像的精度
        matrix = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
        print("matrix:",matrix)

        rect = page.rect                               # 示例:Rect(0.0, 0.0, 882.17138671875, 635.3142700195312)
        clip = fitz.Rect(rect.tl + 15, rect.br - 13)   # 裁剪尺寸,Rect(15.0, 15.0, 869.17138671875, 622.3142700195312)

        # 将其转化为光栅文件(位数)
        pix = page.getPixmap(matrix=matrix, alpha=False, clip=clip)

        if not os.path.exists(imagePath):  # 判断存放图片的文件夹是否存在
            os.makedirs(imagePath)         # 若图片文件夹不存在就创建

        # 设置jpg/tif文件的分辨率,程序默认分辨率为96
        image_dpi = 300
        pix.setResolution(image_dpi, image_dpi)

        # 生成PNG文件
        pix.writePNG(imagePath + '/' + 'pdf2images_%s_%s.png' % (count, i))

if __name__ == "__main__":
    # 1、PDF地址
    pdfPath = r"pdfs"
    # 2、需要储存图片的目录
    imagePath = r"images"
    # 3.文件后缀数字
    count =1
    # 4.获取文件
    files = glob.glob(pdfPath + r'\*.pdf'))
    # 5.循环调用函数进行转化
    for file in files:
    	pyMuPDF_fitz(file, imagePath, count)
    	count+=1
    
    



为什么使用fitz读取pdf转为图片模糊

出现这样的原因有可能是因为,在进行页面读取的时候未指定读取的dpi是多少,使得默认读取去96dpi,所以在进行读取时使用:

    page = doc.load_page(page_number)

    # 获取页面的图像对象
    pix = page.get_pixmap(dpi=200)

import fitz
from PIL import Image

# 打开PDF文件
doc = fitz.open(r"C:\Users\O-c-O\Desktop\11.pdf")

# 遍历每个页面
for page_number in range(doc.page_count):
    # 加载页面
    page = doc.load_page(page_number)

    # 获取页面的图像对象
    matrix = fitz.Matrix(1.0, 1.0)  # 1.0 表示原始尺寸
    # pix = page.get_pixmap(matrix=matrix,dpi=200)
    pix = page.get_pixmap(dpi=200,alpha=False)

    print(pix.width,pix.height)
    # 将图像转换为Pillow的Image对象
    img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)

    # 保存图像为PNG格式,不进行压缩
    dpi = 120  # 设置所需的 DPI 值
    img.save(f'output_{page_number}.png', dpi=(dpi, dpi),)
    # img.save(f'output_{page_number}.png',)

# 关闭文档对象
doc.close()



相关的其他参数还有:
  • matrix:指定应用于页面的转换矩阵(fitz.Matrix 对象)。默认为None,表示不应用任何转换。通过调整缩放、旋转和裁剪等操作,可以对页面进行自定义的转换。
  • clip:指定是否裁剪图像以适应页面边界框。默认为 False,表示不进行裁剪。
  • alpha:指定是否提取图像的透明通道。默认为 False,表示不提取透明通道。
  • dpi:指定图像的采样密度(每英寸像素数量)。默认为 None,表示使用默认的采样密度。
  • band_width:指定每个带宽条的像素宽度。默认为 0,表示禁用带宽条。
  • band_height:指定每个带宽条的像素高度。默认为 0,表示禁用带宽条。
  • band_sep:指定带宽条之间的像素间隔。默认为 0,表示禁用带宽条。
  • band_rows:指定在图像传输期间要生成的带宽条的行数。默认为 0,表示禁用带宽条。



参考


pymupdf.fitz 文档



Python怎么将pdf转为图片?Python如何实现pdf文件转图片



为什么使用fitz读取pdf转为图片模糊



版权声明:本文为weixin_40959890原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。