【小技巧】PDF转图片--python代码高清版
评论
收藏

【小技巧】PDF转图片--python代码高清版

经验分享
阿深
2024-03-26 19:32·浏览量:1596
阿深
发布于 2024-03-26 19:28更新于 2024-03-26 19:321596浏览

问题场景:

在某些场景中,我们需要将PDF转换为图片的格式进行处理,现有指令【将PDF指定页另存为图片】可以实现这个功能。

但是,使用这个指令转换出来的图片,在清晰度上是有所损耗的。而这对某些对清晰度有高要求的场景来说,是不能接受的。(例如一页PDF上有40张条形码,使用这个指令转换出来的结果就会变得很模糊)

在这里我用滴滴的行程单做一个比对:

PDF原文件截图👇

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

可以发现,清晰度还是差比较多的,而且这还是在PDF文件数据量不大的情况下。


解决方案:

  1. 用第三方工具进行解决(例如WPS会员)。
    • 优点:能高清晰度完美地进行转换。  
    • 缺点:需要开通会员,且需要先手动转换,再去跑流程,客户也觉得会有点麻烦。
  2. 在流程中调用Python模块,利用python代码解决。
    • 优点:能完美契合插入各个流程中,且拥有很高的清晰度(可以通过调整DPI进行自由设置)。
    • 缺点:受限于pdf使用的字体和渲染引擎,尝试了各种python库,均无法完美地进行转换还原(体现在会改变某些字体符号的样式)

综上所述,在使用 pdf2image 库PyMuPDF 库之后,发现使用 PyMuPDF 库的转换效果最好,所以我们可以尝试借助这个库来实现PDF转图片的功能。


实现步骤:

  • 第一步:在客户端安装 PyMuPDF 库

  • 第二步:添加python模块,插入以下代码
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的所有页
  • 第三步:调用python模块,设置输入参数

输入参数说明:

# pdf_path:PDF文件路径

# output_folder:输出文件夹路径

# prefix :输出图片文件的前缀名

# dpi:越高清晰度越高,但同时生成的文件大小也越大。默认为600

# fmt:输出图片的格式。默认为PNG

# pages:指定转换图片的页码,可整数,也可列表。默认为None,转换PDF的所有页


效果比对:

下方依次是PDF原文件截图python代码转换(dpi600)官方原有指令三者的效果对比

转换的清晰度还是有很明显的提升。

但是正如我上面所说,受限于pdf使用的字体和渲染引擎,在某些时候python代码并没有办法做到完美还原。如下图:👇

(左图为原文件,右图为转换图片)


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

收藏4
全部评论1
最新
发布评论
评论