寻找可隐藏PDF文件中邮箱地址的工具/脚本(支持Python实现)
寻找可隐藏PDF文件中邮箱地址的工具/脚本(支持Python实现)
嘿,这个需求我刚好折腾过,给你两个方向的方案,按需选择就好:
一、现成工具(不用写代码)
如果不想动手写脚本,可以试试这些工具:
- Adobe Acrobat Pro:付费软件,但功能很完善。你可以用它的「查找替换」功能,用正则匹配邮箱,再配合「红action」工具批量给匹配到的邮箱添加黑色覆盖框,支持批量处理多个PDF文件。
- PDF-XChange Editor:免费版就够用,同样支持正则表达式查找邮箱,找到后直接用「覆盖」功能添加黑色矩形,操作起来很直观,适合快速处理少量文件。
二、Python脚本实现(推荐,符合你的技术栈)
既然你熟悉用Python处理PDF,那用**PyMuPDF(fitz)**库来实现是最方便的——它对PDF文本定位和绘图的支持非常友好,完全能满足你的需求:隐藏文本层的邮箱,同时用黑框覆盖。
步骤1:安装依赖
先安装PyMuPDF:
pip install pymupdf
步骤2:示例脚本
下面是一个可以直接修改使用的脚本,已经做了注释说明:
import fitz # 导入PyMuPDF库 import re def redact_emails(input_pdf_path, output_pdf_path): # 定义匹配邮箱的正则表达式(覆盖大部分常见邮箱格式) email_regex = re.compile(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}') # 打开输入PDF文件 pdf_doc = fitz.open(input_pdf_path) # 遍历PDF的每一页 for page in pdf_doc: # 在当前页查找所有匹配邮箱的文本区域 email_boxes = page.search_for(email_regex) # 给每个邮箱位置画黑色矩形覆盖 for box in email_boxes: # 把边界框稍微扩大一点,确保完全覆盖邮箱(避免漏出边缘字符) expanded_box = fitz.Rect(box) + (2, 2, -2, -2) # 绘制填充的黑色矩形:color是边框色,fill是填充色,这里都设为黑色 page.draw_rect(expanded_box, color=(0, 0, 0), fill=(0, 0, 0)) # 保存处理后的PDF pdf_doc.save(output_pdf_path) pdf_doc.close() # 测试使用(替换成你的输入输出路径) if __name__ == "__main__": input_file = "你的原始PDF文件.pdf" output_file = "处理后隐藏邮箱的PDF文件.pdf" redact_emails(input_file, output_file) print(f"处理完成!结果已保存到:{output_file}")
脚本说明
- 文本查找:用
page.search_for()方法结合正则表达式,精准定位每一个邮箱的位置,返回的是邮箱文本的边界框坐标。 - 覆盖处理:通过
draw_rect()绘制黑色填充矩形,特意把边界框扩大了2个单位,确保能完全盖住邮箱,不会漏出字符。 - 批量处理扩展:如果要处理文件夹里的所有PDF,可以加个循环,用
glob模块遍历文件,比如:
import glob for pdf_path in glob.glob("文件夹路径/*.pdf"): output_path = f"处理后_"+pdf_path.split("/")[-1] redact_emails(pdf_path, output_path)
补充提示
- 如果你不仅想覆盖,还想删除文本层里的邮箱内容,可以试试
page.delete_text(rect=expanded_box)方法,但要注意:删除文本可能会影响PDF的排版(比如留下空白),而画黑框的方式更稳妥,也符合你“不需要完美”的预期。 - 测试时先拿单个PDF文件试手,调整边界框的扩展值(比如把
(2,2,-2,-2)改成(1,1,-1,-1)),找到最适合的覆盖范围。
备注:内容来源于stack exchange,提问作者Hanan Cohen




