如何用Python提取PDF中Adobe标记的各类敏感隐藏数据?
提取PDF中Adobe标记的敏感隐藏数据方案
核心思路
针对Adobe识别的几类敏感数据(Metadata、Bookmarks、Comments and Markup、Hidden Text、Links/actions/javascripts、Overlapping objects),结合Python的PyMuPDF(fitz)库实现精准提取——PyPDF2功能有限,PyMuPDF能直接操作PDF底层结构,适配大部分隐藏数据的提取需求。
分类型提取实现代码
1. 提取Metadata(元数据)
直接获取PDF文档的所有元数据字段,包含作者、创建日期、主题等信息:
import fitz # PyMuPDF def extract_metadata(pdf_path): doc = fitz.open(pdf_path) metadata = doc.metadata doc.close() return metadata # 调用示例 metadata = extract_metadata("target.pdf") print("PDF元数据:", metadata)
2. 提取Bookmarks(书签)
遍历PDF所有书签节点,包含层级、标题和对应页码:
import fitz def extract_bookmarks(pdf_path): doc = fitz.open(pdf_path) bookmarks = [] # 遍历目录树结构的书签 for bm in doc.get_toc(): bookmarks.append({"层级": bm[0], "标题": bm[1], "页码": bm[2]}) doc.close() return bookmarks # 调用示例 bookmarks = extract_bookmarks("target.pdf") print("PDF书签:", bookmarks)
3. 提取Comments and Markup(批注与标记)
获取所有页面的批注内容,包含批注类型、作者和具体文本:
import fitz def extract_comments(pdf_path): doc = fitz.open(pdf_path) comments = [] for page in doc: annots = page.annots() if annots: for annot in annots: comments.append({ "页码": page.number + 1, "批注类型": annot.type[1], "内容": annot.info.get("content", ""), "作者": annot.info.get("title", "") }) doc.close() return comments # 调用示例 comments = extract_comments("target.pdf") print("PDF批注:", comments)
4. 提取Hidden Text(隐藏文本)
通过检测文本颜色与背景色是否一致,识别并提取隐藏文本:
import fitz def extract_hidden_text(pdf_path): doc = fitz.open(pdf_path) hidden_text = [] # 默认PDF背景色为白色(1.0,1.0,1.0),可根据实际文档调整 bg_color = (1.0, 1.0, 1.0) for page in doc: text_blocks = page.get_text("dict")["blocks"] for block in text_blocks: if "lines" in block: for line in block["lines"]: for span in line["spans"]: if span["color"] == bg_color: hidden_text.append({ "页码": page.number + 1, "隐藏文本内容": span["text"] }) doc.close() return hidden_text # 调用示例 hidden_text = extract_hidden_text("target.pdf") print("PDF隐藏文本:", hidden_text)
5. 提取Links, Actions and Javascripts(链接、动作与脚本)
提取页面跳转链接、外部URL及文档级嵌入脚本:
import fitz def extract_links_actions(pdf_path): doc = fitz.open(pdf_path) links = [] # 提取页面链接 for page in doc: page_links = page.get_links() for link in page_links: links.append({ "页码": page.number + 1, "链接类型": link["kind"], "目标": link.get("uri", link.get("page", "")) }) # 提取文档级Javascript doc_js = doc.get_js() doc.close() return {"页面链接": links, "文档脚本": doc_js} # 调用示例 links_actions = extract_links_actions("target.pdf") print("PDF链接与脚本:", links_actions)
6. 提取Overlapping Objects(重叠对象)
检测图形与文本块的重叠区域,识别被遮挡的内容:
import fitz def detect_overlapping_objects(pdf_path): doc = fitz.open(pdf_path) overlapping_info = [] for page in doc: # 获取页面所有图形对象 shapes = page.get_drawings() # 获取页面所有文本块位置与内容 text_blocks = page.get_text("dict")["blocks"] for shape in shapes: shape_rect = fitz.Rect(shape["rect"]) for block in text_blocks: block_rect = fitz.Rect(block["bbox"]) if shape_rect.intersects(block_rect): content_preview = block.get("text", "")[:50] + "..." if len(block.get("text", ""))>50 else block.get("text", "") overlapping_info.append({ "页码": page.number + 1, "重叠图形类型": shape["type"], "被遮挡文本预览": content_preview }) doc.close() return overlapping_info # 调用示例 overlapping = detect_overlapping_objects("target.pdf") print("PDF重叠对象:", overlapping)
批量处理整合
将上述函数整合,批量处理指定目录下的PDF文件,结果导出为CSV报表:
import os import csv def batch_process_pdfs(folder_path, output_csv): with open(output_csv, "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["文件名", "数据类型", "内容"]) for filename in os.listdir(folder_path): if filename.endswith(".pdf"): pdf_path = os.path.join(folder_path, filename) # 写入各类数据 writer.writerow([filename, "元数据", str(extract_metadata(pdf_path))]) writer.writerow([filename, "书签", str(extract_bookmarks(pdf_path))]) writer.writerow([filename, "批注", str(extract_comments(pdf_path))]) writer.writerow([filename, "隐藏文本", str(extract_hidden_text(pdf_path))]) writer.writerow([filename, "链接与脚本", str(extract_links_actions(pdf_path))]) writer.writerow([filename, "重叠对象", str(detect_overlapping_objects(pdf_path))]) # 调用示例 batch_process_pdfs("pdf_files", "sensitive_data_report.csv")
注意事项
- 安装依赖:执行
pip install pymupdf安装最新稳定版PyMuPDF - 隐藏文本判断逻辑可根据实际PDF背景色调整,部分文档可能通过设置字体大小为0隐藏文本,可扩展判断条件
- 重叠对象检测仅覆盖图形遮挡文本的场景,若需处理文本遮挡文本,需进一步优化文本块层级判断逻辑
内容的提问来源于stack exchange,提问作者Kristyn Ferber
相关产品推荐
相关产品推荐

