esXGray可以用来直接漂白一份PDF中的所有图片,之前漂白PDF全文图片的功能有些问题,今日换了一种实现方式,核心思路如下:
- 遍历所有图片记录bbox信息
- 删除所有图片
- 将图片按顺序添加到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)