在某些场景中,我们需要将PDF转换为图片的格式进行处理,现有指令【将PDF指定页另存为图片】可以实现这个功能。
但是,使用这个指令转换出来的图片,在清晰度上是有所损耗的。而这对某些对清晰度有高要求的场景来说,是不能接受的。(例如一页PDF上有40张条形码,使用这个指令转换出来的结果就会变得很模糊)
在这里我用滴滴的行程单做一个比对:
PDF原文件截图👇

用【将PDF指定页另存为图片】转换后的图片截图👇

可以发现,清晰度还是差比较多的,而且这还是在PDF文件数据量不大的情况下。
综上所述,在使用 pdf2image 库和 PyMuPDF 库之后,发现使用 PyMuPDF 库的转换效果最好,所以我们可以尝试借助这个库来实现PDF转图片的功能。

import fitz # PyMuPDF
import os
def convert_pdf_to_images(pdf_path, output_folder, prefix, dpi=600, fmt='png', pages=None):
# 打开PDF文件
doc = fitz.open(pdf_path)
# 确保输出文件夹存在
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 设置转换选项
zoom = dpi / 72 # PyMuPDF的基本DPI是72
mat = fitz.Matrix(zoom, zoom)
# 如果 pages 参数为 None 或者是空列表,则转换所有页面
if not pages:
page_numbers = range(doc.page_count)
else:
# 确保 pages 是列表
if isinstance(pages, int):
pages = [pages]
# 转换为从 0 开始的索引
page_numbers = [p - 1 for p in pages]
# 遍历指定的页面编号
for page_num in page_numbers:
# 获取单独的页面
page = doc[page_num]
# 获取页面的pixmap对象,这是页面的图像表示
pix = page.get_pixmap(matrix=mat)
# 定义输出路径
image_path = os.path.join(output_folder, f"{prefix}_{page_num + 1}.{fmt}")
# 保存图像
pix.save(image_path)
# 输出保存信息
print(f"Saved {prefix} {page_num + 1} as '{image_path}'")
# 关闭文档
doc.close()
# 参数说明
# pdf_path:PDF文件路径
# output_folder:输出文件夹路径
# prefix :输出图片文件的前缀名
# dpi:越高清晰度越高,但同时生成的文件大小也越大。默认为600
# fmt:输出图片的格式,默认为PNG
# pages:指定转换图片的页码,可整数,也可列表。默认为None,转换PDF的所有页
输入参数说明:
# pdf_path:PDF文件路径
# output_folder:输出文件夹路径
# prefix :输出图片文件的前缀名
# dpi:越高清晰度越高,但同时生成的文件大小也越大。默认为600
# fmt:输出图片的格式。默认为PNG
# pages:指定转换图片的页码,可整数,也可列表。默认为None,转换PDF的所有页
下方依次是PDF原文件截图、python代码转换(dpi600)、官方原有指令三者的效果对比



转换的清晰度还是有很明显的提升。
但是正如我上面所说,受限于pdf使用的字体和渲染引擎,在某些时候python代码并没有办法做到完美还原。如下图:👇
(左图为原文件,右图为转换图片)

所以大家可以根据实际情况进行尝试和使用。