通过PDF阅读或编辑工具,可在PDF中加入Watermark
标识的PDF水印,如下图:
该类水印特点
这类型的水印,会在文件的字节流中出现/Watermark
、EMC
等标识,那么,我们可以通过改变文件字节内容,清理掉这些水印。
水印去除
安装pymupdf
:
pip install --upgrade pymupdf
清理水印代码如下:
"""
移除PDF文件中的水印参数:input_pdf_path (str): 输入PDF文件的路径output_pdf_path (str): 输出PDF文件的路径
"""
def remove_pdf_watermark(input_pdf_path, output_pdf_path):# 打开PDF文件doc = fitz.open(input_pdf_path)for page in doc:page.clean_contents() # 清理页面绘图命令xref = page.get_contents()[0] # 获取页面字节流,以xref的形式返回 cont0 = doc.xref_stream(xref).decode() # 将流解码为字符串if '/Watermark' in cont0: # 找到水印标识start = cont0.index("/Artifact") # 获取水印起始位置end = cont0.index("EMC", start) # 获取水印结束位置cont = cont0[:start] + cont0[end:] # 替换掉水印doc.update_stream(xref, cont.encode()) # 更新流doc.save(output_pdf_path, garbage=4) # 保存修改后的PDF文件 doc.close()
代码功能解析
这段代码的功能是移除PDF文件中的水印。具体步骤如下:
- 打开输入的PDF文件。
- 遍历每一页,清理页面绘图命令。
- 获取页面字节流并解码为字符串。
- 检查是否包含水印标识 /Watermark。
- 如果找到水印,定位其起始和结束位置,并替换掉水印内容。
- 更新页面字节流。
- 保存修改后的PDF文件。
控制流图(CFG)
代码原理
- 开始:程序开始执行。
- 打开PDF文件:使用
fitz.open
方法打开输入的PDF文件。 - 遍历每一页:检查是否还有未处理的页面。
- 清理页面绘图命令:调用
page.clean_contents
方法清理页面绘图命令。 - 获取页面字节流并解码:获取页面字节流并将其解码为字符串。
- 是否包含水印标识:检查解码后的字符串中是否包含水印标识
/Watermark
。 - 定位水印起始和结束位置:如果找到水印标识,定位其起始和结束位置。
- 替换掉水印内容:将水印部分从字符串中移除。
- 更新页面字节流:将修改后的内容重新编码并更新页面字节流。
- 保存修改后的PDF文件:保存修改后的PDF文件到指定路径。
- 关闭PDF文件:关闭PDF文件。
- 结束:程序结束执行。