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

如何使用Python检测PDF文件是否包含JavaScript、PostScript等活动内容?

如何用Python检测PDF中的JavaScript和PostScript活动内容

嘿,这个问题我刚好研究过!要检测PDF里的JavaScript或PostScript这类带活动性质的内容,其实核心就是解析PDF的内部结构,找出藏着这些代码的标记或对象。下面分享几个实用的Python方案,亲测靠谱:

方法一:用PyPDF2快速检测(入门友好)

PyPDF2是个上手简单的PDF处理库,能帮我们快速扫描PDF里的关键标记。

首先安装依赖:

pip install PyPDF2

然后用这段代码检测:

from PyPDF2 import PdfReader

def detect_pdf_scripts(pdf_path):
    reader = PdfReader(pdf_path)
    has_javascript = False
    has_postscript = False

    # 检查文档打开时的自动执行动作
    if "/OpenAction" in reader.metadata:
        open_action = reader.metadata["/OpenAction"]
        if isinstance(open_action, dict) and "/JS" in open_action:
            has_javascript = True

    # 遍历每个页面的附加触发动作(比如打开/关闭页面时执行的脚本)
    for page in reader.pages:
        if "/AA" in page:
            for _, action in page["/AA"].items():
                if "/JS" in action:
                    has_javascript = True
                    break
            if has_javascript:
                break

        # 检查页面内容中是否有PostScript相关标记
        page_content = page.extract_text()
        if page_content and ("PostScript" in page_content or "/ProcSet" in page_content):
            has_postscript = True

    # 扫描所有PDF对象,不放过任何藏着脚本的地方
    for obj in reader.objects:
        if isinstance(obj, dict):
            if "/JS" in obj or "/JavaScript" in obj:
                has_javascript = True
            if "/PostScript" in obj:
                has_postscript = True

    return {"has_javascript": has_javascript, "has_postscript": has_postscript}

# 调用示例
result = detect_pdf_scripts("your_file.pdf")
print(f"是否存在JavaScript: {result['has_javascript']}")
print(f"是否存在PostScript: {result['has_postscript']}")

这个脚本会检查三个关键位置:文档打开动作、页面附加动作,以及所有PDF对象里的脚本标记,基本能覆盖大多数常规情况。

方法二:用pdfminer.six深度解析(适合复杂PDF)

如果遇到结构复杂或者加密的PDF,pdfminer.six会更靠谱——它能深入解析PDF的底层对象,处理间接引用的内容。

先安装依赖:

pip install pdfminer.six

然后用这段代码检测:

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdftypes import resolve1

def detect_scripts_with_pdfminer(pdf_path):
    has_javascript = False
    has_postscript = False

    with open(pdf_path, 'rb') as f:
        parser = PDFParser(f)
        doc = PDFDocument(parser)

        # 检查文档级的打开动作
        if "OpenAction" in doc.catalog:
            open_action = resolve1(doc.catalog["OpenAction"])
            if isinstance(open_action, dict) and "JS" in open_action:
                has_javascript = True

        # 遍历所有PDF对象,解析间接引用的内容
        for objid in doc.xref:
            obj = resolve1(doc.getobj(objid))
            if isinstance(obj, dict):
                # 检查脚本相关的字典键
                if "JS" in obj or "JavaScript" in obj:
                    has_javascript = True
                if "PostScript" in obj or "ProcSet" in obj:
                    has_postscript = True
                # 检查动作字典里的脚本
                if "Action" in obj:
                    action = resolve1(obj["Action"])
                    if isinstance(action, dict) and "JS" in action:
                        has_javascript = True

    return {"has_javascript": has_javascript, "has_postscript": has_postscript}

# 调用示例
result = detect_scripts_with_pdfminer("your_file.pdf")
print(f"是否存在JavaScript: {result['has_javascript']}")
print(f"是否存在PostScript: {result['has_postscript']}")

这里的resolve1函数是关键,它能把PDF里的间接引用对象转换成实际内容,避免漏掉藏在深层的脚本。

额外注意事项

  • 如果PDF是加密的,记得先调用解密方法(比如PyPDF2里的reader.decrypt("your_password")),否则无法解析内容。
  • 有些恶意PDF会把JavaScript代码压缩或混淆在流里,这时候可以尝试提取流数据(比如用obj.get_data()获取流内容),再进一步检查是否包含脚本特征。
  • PostScript可能嵌入在资源字典或流中,上面的代码能检测常规标记,若要更深入,可以提取流内容后搜索PostScript关键字。

内容的提问来源于stack exchange,提问作者Martin Thoma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:07:46