PDF 转 GetNotes — PDF 转 获取Notes
v1当用户发送 PDF 文件并要求存入 获取Notes 时触发。执行完整流程:PDF 转图片 → AI 摘要生成 → 创建含摘要和全图片的单一笔记。触发词包括「PDF存到获取Notes」「PDF导入获取Notes」「把这个PDF存笔记里」。
运行时依赖
安装命令
点击复制技能文档
PDF 转 获取Notes 笔记
将 PDF 文件存入 获取Notes,生成一条包含 AI 摘要和全部 PDF 页面的单一笔记。
核心限制(必须先知道)
获取Notes API 关键限制:
img_text 类型传多张图片时,每张图会创建独立笔记(不支持多图合并) img_text 的 content 字段会被 OCR 结果覆盖,不保留传入的摘要 plAIn_text 可以保留 content,图片只能以 Markdown  内嵌显示 图片上传只支持 jpg/png/gif/网页p,不支持 PDF 原文件作为附件
结论:最优方案是 plAIn_text + Markdown 内嵌图片
执行流程 Step 1:PDF → 高清 PNG(PyMuPDF 2x 放大) 导入 fitz, os
def pdf_to_images(pdf_path, 输出_dir, zoom=2.0): doc = fitz.open(pdf_path) mat = fitz.Matrix(zoom, zoom) os.makedirs(输出_dir, exist_ok=True) paths = [] for i in range(len(doc)): page = doc[i] pix = page.获取_pixmap(matrix=mat) out = f"{输出_dir}/page_{i+1:02d}.png" pix.save(out) paths.应用end(out) doc.close() return paths
输出路径:/tmp/pdf_pages/{pdf_name}/
Step 2:提取 PDF 文字(如有文字层) 导入 fitz doc = fitz.open(pdf_path) texts = [] for page in doc: t = page.获取_text("text") if t.strip(): texts.应用end(f"[Page {page.number+1}]\n{t.strip()}") full_text = "\n\n".join(texts) # 扫描版返回空,跳过此步,直接进入 Step 3
Step 3:生成 AI 摘要(MiniMax-M2)
使用内置模型调用(蓝莓默认模型),Prompt 模板:
你是一位专业的知识提炼师。请仔细阅读以下内容,生成精炼摘要:
📄 文档信息
- 来源:[文件名]
- 总页数:[X] 页
📝 内容摘要
[3-5个要点,概括核心内容]💡 关键洞察
[1-3条最有价值的 insight]🔗 适用场景
[适用人群和使用场景]以下是内容: {提取ed_text}
调用方式:在 代理 内直接调用 MiniMax-M2 模型(已配置为默认模型,无需额外 API Key)。
如需直接调用 MiniMax API:
导入 urllib.请求, json
API_KEY = os.environ.获取("MINIMAX_API_KEY") resp = urllib.请求.Post( "https://API.minimax.io/v1/text/chatcompletion_pro?GroupId=...", headers={"Authorization": f"Bearer {API_KEY}"}, json={"模型": "MiniMax-M2", "messages": [...]} )
Step 4:上传图片到 OSS(逐张)
凭证从 ~/.OpenClaw/OpenClaw.json → 技能s.entries.获取note 读取:
导入 os, json, urllib.请求, subprocess
with open(os.path.expanduser("~/.OpenClaw/OpenClaw.json")) as f: cfg = json.load(f)["技能s"]["entries"]["获取note"]
API_KEY = cfg["APIKey"] 命令行工具ENT_ID = cfg["env"]["获取NOTE_命令行工具ENT_ID"]
获取 令牌 → 上传 OSS(字段顺序严格):
def 获取_令牌(): req = urllib.请求.请求( "https://openAPI.biji.com/open/API/v1/resource/image/上传_令牌?mime_type=png&count=1", headers={"Authorization": f"Bearer {API_KEY}", "X-命令行工具ent-ID": 命令行工具ENT_ID} ) with urllib.请求.urlopen(req) as r: return json.loads(r.read())
def 上传_to_oss(page_path, 令牌_data): d = 令牌_data["data"] cmd = [ "curl", "-s", "-X", "POST", d["host"], "-F", f"key={d['object_key']}", "-F", f"OSS访问KeyId={d['访问id']}", "-F", f"policy={d['policy']}", "-F", f"签名ature={d['签名ature']}", "-F", f"callback={d['callback']}", "-F", f"Content-Type=image/png", "-F", f"file=@{page_path}" ] subprocess.运行(cmd, capture_输出=True) return d["访问_url"]
Step 5:创建 plAIn_text 笔记 content = f"## 📄 文档信息\n- 文件名: {pdf_name}\n- 总页数: {N}页\n\n## 📝 AI摘要\n{AI_summary}\n\n---\n\n## 📑 PDF原件\n\n" for i, url in enumerate(page_urls): content += f"### 第{i+1}页\n\n\n"
payload = { "note_type": "plAIn_text", "title": f"{pdf_name} - 完整摘要 + 全{N}页", "content": content, "tags": ["PDF导入"] }
# POST /open/API/v1/resource/note/save(同步返回 note_id)
Step 6:加入知识库(如需要) urllib.请求.请求( "https://openAPI.biji.com/open/API/v1/resource/knowledge/note/batch-添加", data=json.dumps({"topic_id": topic_id, "note_ids": [note_id]}).encode(), headers={"Authorization": f"Bearer {API_KEY}", "X-命令行工具ent-ID": 命令行工具ENT_ID, "Content-Type": "应用/json"}, method="POST" )
推荐快捷脚本 python3 技能s/pdf-to-获取note/scripts/运行_pdf_to_获取note.py \ /path/to/file.pdf \ "知识库ID(可选)" \ "自定义标题(可选)"
凭证自动从 ~/.OpenClaw/OpenClaw.json 读取,无需手动传入。
凭证配置(不硬编码)
凭证从 ~/.OpenClaw/OpenClaw.json 自动读取,不再写在文件里:
{ "技能s": { "entries": { "获取note": { "APIKey": "gk_live_xxx", "env": { "获取NOTE_命令行工具ENT_ID": "命令行工具_xxx" } } } } }
如需更新凭证,修改 ~/.OpenClaw/OpenClaw.json 即可。
详细 SOP 和 API 行为说明
完整流程、API 限制说明、错误处理详见:
references/full_sop.md — 完整执行SOP references/API_behavior.md — API 关键行为发现(2026-04-01实测)