esXGray功能解析01:全自动漂白PDF,使用PyMuPDF替换PDF中所有图片

发布时间 2023-07-11 17:39:35作者: Moneky

esXGray可以用来直接漂白一份PDF中的所有图片,之前漂白PDF全文图片的功能有些问题,今日换了一种实现方式,核心思路如下:

  1. 遍历所有图片记录bbox信息
  2. 删除所有图片
  3. 将图片按顺序添加到PDF中实现替换功能

前面在网上搜索良久,代码都有一些问题,不够完美,今日几经修改,目前效果还比较完美,测试了一些文件,操作结果符合预期,包括一些半透明图片。上代码如下:

import fitz
def replace_images3(input_pdf, output_pdf, image_list):
    pdf = fitz.open(input_pdf)  # 读取图片
    img_id = 0
    bbox_dic = {}
    for page in range(len(pdf)):
        bbox_dic[page] = []
        for img in pdf.get_page_images(page):
            if not pdf[page].get_image_bbox(img[7]).isEmpty:
                bbox_dic[page].append(pdf[page].get_image_bbox(img[7]))  # 将位置信息存入dict
                pdf._deleteObject(img[0])  # 删除图片

    for page in range(len(pdf)):
        for i in range(len(bbox_dic[page])):
            bbox = bbox_dic[page][i]  # 取出位置
            fn = image_list[img_id]  # 从list中取出新图文件名
            pdf[page].insert_image(bbox, filename=fn)  # 根据文件名插入图片
            img_id += 1

    pdf.save(output_pdf)  # 保存

  测试代码如下:

img_path = "C:\\Users\\eerso\\Desktop\\PDF_PNG\\output\\"
imgs = []
# 下面代码手动生成imgs图片文件列表
for n in range(1, 4):
    imgs.append(img_path + str(n) + '.png')
imgs.append(img_path + '4.jpeg')
replace_images3(r"C:\Users\eerso\Desktop\PDF_PNG\new.pdf", r"C:\Users\eerso\Desktop\PDF_PNG\new_x.pdf", imgs)