经过测试,fitz是目前PDF转图片相对较简单快捷且无bug的一个方法,不会出现转换图片时白屏的情况。弊端是转换较慢。
fitz——高质量转PDF
安装
- pip install traits
- pip install fitz
- pip install PyMuPDF
示例
代码语言:txt复制import os
import fitz
import traceback
from concurrent.futures import ThreadPoolExecutor, wait
from loguru import logger
'''
# 将PDF转化为图片
pdfPath pdf文件的路径
imgPath 图像要保存的文件夹
zoom_x x方向的缩放系数
zoom_y y方向的缩放系数
rotation_angle 旋转角度
zoom_x和zoom_y一般取相同值,值越大,图像分辨率越高。
'''
# 读取存放PDF的文件夹
file_path = r"E:合同PDF\HTPDF1\"
# 保存文件夹
save_path = r"F:HTPNG1\"
file_list = os.listdir(file_path)
# 日志模块
logger.add('pdf2png.log', format="{time} {level} {message}", level="INFO")
# pdf_image(r"E:PyPro小功能PDF切割图片PDF 700000062.pdf", r"E:PyPro小功能PDF切割图片PNG\", 2, 2, 0)
def pdf_image(pdfPath, imgPath=save_path, zoom_x=2, zoom_y=2, rotation_angle=0):
CosNo = pdfPath.split('\')[-1].strip('.pdf')
logger.info(f"开始切割 {CosNo}")
save_path_dir=imgPath CosNo '\'
os.mkdir(save_path_dir)
try:
# 打开PDF文件
pdf = fitz.open(pdfPath)
# 逐页读取PDF
for pg in range(0, pdf.pageCount):
page = pdf[pg]
# 设置缩放和旋转系数
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
pm = page.getPixmap(matrix=trans, alpha=False)
# 开始写图像
pm.writePNG(save_path_dir CosNo '_' str(pg 1) ".jpg")
pdf.close()
except:
logger.error(f"{CosNo} 切割失败")
print(traceback.print_exc())
return False
logger.info(f"{CosNo} 切割完毕")
return True
if __name__ == '__main__':
t=ThreadPoolExecutor(20)
tt=[]
for filename in file_list:
if '.pdf' in filename:
full_path=file_path filename
task=t.submit(pdf_image,full_path)
tt.append(task)
wait(tt)
参数解释
zoom_x:x方向的缩放系数
zoom_y:y方向的缩放系数
rotation_angle:旋转角度
注意:
zoom_x 和 zoom_y 一般是相同的
系数越大,像素越高,越清晰,相对文件越大。
实测一般 2 满足清晰度以及大小的需求