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 版权协议,转载请附上原文出处链接和本声明。