You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)

提取页面跳转链接、外部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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:20:12