python去掉图片上的文字水印_【原创】python批量删除pdf图片水印(Xobject)的一种方法...

1.说明:

下载到的pdf总会有一些水印,pdf文件水印添加方式除了acrobat adobe自带的以外,还有很多,所以去除水印方法也很多,这里介绍的也只是一种适用python批量删除图片水印Xobject的方法,对于不想装pitstop、abbyy的情况可供君参考,程序需要完善的地方很多,目前只是实现单一的批量删除pdf图片水印。

2.分析:

分析原pdf水印,排除是页眉页脚,Acrobat添加水印等,在内容窗口分析,可看出此pdf水印为图片水印。

none.gif

001.png (285.23 KB, 下载次数: 1)

2020-10-17 12:06 上传

2.1 思路:

使用python的fitz库,pdf逐页提取扫描图片,图片再次合并为新pdf,完成“删除”水印。

网上有现成使用fitz库中._getXrefString()方法提取所有图片的代码,测试发现图片提取没有问题,但因为图片提取时无识别,导致提取页面顺序是乱的,水印页面也同样提取,需要通过另外的代码去判别剔除(使用PIL对大小判定可实现),顺序问题在在未深刻理解源代码的前提下未解决,故使用前述逐页提取目标页的方法,调试可行。

2.2 调试:

单页分析,使用fitz的page类下.getImageList()方法,单页得到所有图片信息数组,进一步分析其中的图片大小,可识别出第一个元素即为目标页,再第一个元素即为Xref,所以过程简化为逐页提取所有信息数组第一个元素即可。

none.gif

002.png (63.31 KB, 下载次数: 3)

2020-10-17 12:06 上传

输出图片后,使用fitz对图片逐页转成pdf并插入新pdf,最终输出页面图片(也可以选择不保存)以及新pdf。

none.gif

004.png (20.6 KB, 下载次数: 1)

2020-10-17 12:06 上传

none.gif

003.png (231.36 KB, 下载次数: 0)

2020-10-17 12:06 上传

3.代码实现:

import fitz #pip install pymupdf

import io,os

from PIL import Image

path = r'更大的信息 test.pdf' #目标pdf

pdfname = path.split(".")[0]

f_path = r'img\\' #图片输出文件夹

pdf = fitz.open(path)

doc = fitz.open()

#逐页读取页面

for page_index in range(len(pdf)):

page = pdf[page_index]

target_xref= page.getImageList()[0][0]#取得当前页面目标页xref信息

base_image = pdf.extractImage(target_xref)

image_bytes = base_image["image"] #提取image信息

image_ext = base_image["ext"] #提取图片后缀

image = Image.open(io.BytesIO(image_bytes)) #输出保存图片

output_path = f"{f_path}{pdfname}_{(page_index+1):03}.{image_ext}"

image.save(output_path)

imgdoc = fitz.open(output_path) #对输出图片转pdf

pdfbytes = imgdoc.convertToPDF()

imgpdf = fitz.open("pdf", pdfbytes)

doc.insertPDF(imgpdf) #逐页插入图片

# os.remove(output_path) # 逐页删除图片(可选)

doc.save(f"{f_path}{pdfname}_neo.pdf") #保存新pdf完成图片水印删除

你可能感兴趣的:(python去掉图片上的文字水印_【原创】python批量删除pdf图片水印(Xobject)的一种方法...)