如何使用pypdf从PDF文件中提取JavaScript脚本?
使用pypdf 4.2.0提取并迁移PDF中的JavaScript
提取PDF中的JavaScript
要提取PDF中存储在/JavaScript字典内的脚本,可通过访问PDF目录(Catalog)的对应节点实现。针对你提供的PDF脚本结构(存储在/Names数组的命名动作中),用以下代码提取:
from pypdf import PdfReader def extract_pdf_js(pdf_path): reader = PdfReader(pdf_path) # 获取PDF目录对象 catalog = reader.trailer["/Root"] js_scripts = {} # 检查目录中是否存在JavaScript字典 if "/JavaScript" in catalog: js_dict = catalog["/JavaScript"] # 获取命名的JavaScript动作列表 if "/Names" in js_dict: names = js_dict["/Names"] # 遍历名称-动作对(每两个元素为一组:名称 + 动作对象) for i in range(0, len(names), 2): js_name = names[i] action_obj = names[i+1] # 提取动作中的JavaScript代码 if "/JS" in action_obj: js_code = action_obj["/JS"] # 处理PDF内的转义字符 js_code = js_code.replace("\\(", "(").replace("\\)", ")").replace("&", "&") js_scripts[js_name] = js_code return js_scripts
调用示例:
# 提取指定PDF中的所有命名JS脚本 extracted_js = extract_pdf_js("source.pdf") # 获取目标JSInit脚本 jsinit_code = extracted_js.get("JSInit", "")
将提取的JavaScript写入新PDF
用你已经熟悉的writer.add_js()方法,将提取到的脚本写入目标PDF:
from pypdf import PdfWriter, PdfReader def add_js_to_pdf(source_pdf_path, target_pdf_path, js_code): writer = PdfWriter() # 读取目标PDF模板(若需新建空白PDF可跳过此步骤) reader = PdfReader(source_pdf_path) for page in reader.pages: writer.add_page(page) # 添加JavaScript writer.add_js(js_code) # 保存新PDF with open(target_pdf_path, "wb") as f: writer.write(f)
调用示例:
# 将提取到的JSInit脚本写入目标PDF add_js_to_pdf("target_template.pdf", "output_with_js.pdf", jsinit_code)
说明
- 上述代码适配了你提供的PDF脚本结构(命名为
JSInit的JavaScript动作),若PDF内有多个命名JS脚本,extract_pdf_js函数会返回所有脚本的字典(键为脚本名称,值为代码)。 - 代码处理了PDF内常见的转义字符,确保提取的代码可直接复用。
内容的提问来源于stack exchange,提问作者Albin Dennevi
相关产品推荐
相关产品推荐

