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

求助:如何在PDF中嵌入可在浏览器执行的JavaScript?

解决嵌入JavaScript到PDF并在浏览器中运行的问题

一、修复PyPDF2脚本的报错问题

你遇到的Incorrect first char in NameObject:((app.alert("Startup"));)错误,是因为脚本对PDF NameObject的格式处理不符合规范——PDF的NameObject必须以/开头,且JavaScript代码不能直接作为NameObject的值,需要封装到专门的动作字典中。

修正后的核心逻辑示例:

from PyPDF2 import PdfReader, PdfWriter

def embed_js_to_pdf(input_pdf, output_pdf, js_code):
    reader = PdfReader(input_pdf)
    writer = PdfWriter()

    # 复制原PDF所有页面
    for page in reader.pages:
        writer.add_page(page)

    # 构建符合PDF规范的JavaScript动作
    js_action = {
        "/S": "/JavaScript",  # 指定动作类型为JavaScript
        "/JS": js_code        # 传入要执行的JS代码
    }

    # 设置文档打开时自动触发该动作
    writer._root_object.update({"/OpenAction": js_action})

    # 写入输出文件
    with open(output_pdf, "wb") as f:
        writer.write(f)

# 调用示例:给input.pdf嵌入启动弹窗JS,生成output.pdf
embed_js_to_pdf("input.pdf", "output.pdf", 'app.alert("PDF loaded!");')

二、浏览器PDF阅读器的关键限制

你用Edge、Firefox或Chrome打开PDF无弹窗的核心原因:现代浏览器内置的PDF阅读器(如Chrome的PDFium、Edge的Chromium PDF引擎)出于安全考虑,完全禁用了PDF中的JavaScript执行功能。

只有Adobe Acrobat Reader/Pro才完整支持PDF的JavaScript特性,包括打开自动运行的脚本。浏览器为了防范恶意PDF攻击,直接砍掉了这部分支持,所以即使你正确嵌入JS,在浏览器环境下也不会触发执行。

三、实现目标的可行方案

  1. 使用Adobe Acrobat测试:生成正确的带JS的PDF后,用Acrobat Reader打开,就能看到预期的弹窗效果——这也是恶意软件分析领域测试此类样本的标准方式。
  2. 历史漏洞模拟(仅用于课程实验):若要在浏览器中触发执行,只能依赖旧版本浏览器的PDF解析漏洞(这类漏洞大多已被修复),需在受控实验环境中使用对应旧版本浏览器和构造的漏洞样本,仅适合课程学习研究。

四、手动修改PDF的规范步骤(替代脚本)

如果坚持手动修改,需严格遵循PDF规范(仅建议用未压缩的简单PDF测试):

  1. 用文本编辑器打开目标PDF
  2. 在文档的Catalog字典中添加/OpenAction条目,指向JavaScript动作:
    /Catalog
    <<
      /Pages 1 0 R  # 保留原PDF的Pages引用
      /OpenAction << /S /JavaScript /JS (app.alert("Startup");) >>
    >>
    
  3. 注意:手动修改极易破坏PDF的交叉引用表和结构,建议优先用工具生成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:30:38