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)