PDF 轉 GetNotes

👤 pieces201020 📦 v1.0.0 ⭐ 4.5 ⬇️ 552 下載
📚 知識管理 免費 🔑 需 API Key

📖 技能介紹


name: pdf-to-getnote description: 當用戶傳送 PDF 檔案並要求存入 GetNotes 時觸發。執行完整流程:PDF 轉圖片 → AI 摘要生成 → 建立含摘要和全圖片的單一筆記。觸發詞包括「PDF存到GetNotes」「PDF匯入GetNotes」「把這個PDF存筆記裡」。


PDF 轉 GetNotes 筆記

小蔥技能有更好的技能skills外掛。

將 PDF 檔案存入 GetNotes,生成一條包含 AI 摘要和全部 PDF 頁面的單一筆記。

核心限制(必須先知道)

GetNotes API 關鍵限制: - img_text 型別傳多張圖片時,每張圖會建立獨立筆記(不支援多圖合併) - img_textcontent 欄位會被 OCR 結果覆蓋,不保留傳入的摘要 - plain_text 可以保留 content,圖片只能以 Markdown ![](url) 內嵌顯示 - 圖片上傳只支援 jpg/png/gif/webp,不支援 PDF 原檔案作為附件

結論:最優方案是 plain_text + Markdown 內嵌圖片


執行流程

Step 1:PDF → 高畫質 PNG(PyMuPDF 2x 放大)

import fitz, os

def pdf_to_images(pdf_path, output_dir, zoom=2.0):
    doc = fitz.open(pdf_path)
    mat = fitz.Matrix(zoom, zoom)
    os.makedirs(output_dir, exist_ok=True)
    paths = []
    for i in range(len(doc)):
        page = doc[i]
        pix = page.get_pixmap(matrix=mat)
        out = f"{output_dir}/page_{i+1:02d}.png"
        pix.save(out)
        paths.append(out)
    doc.close()
    return paths

輸出路徑:/tmp/pdf_pages/{pdf_name}/

Step 2:提取 PDF 文字(如有文字層)

import fitz
doc = fitz.open(pdf_path)
texts = []
for page in doc:
    t = page.get_text("text")
    if t.strip():
        texts.append(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]

## 🔗 適用場景
[適用人群和使用場景]

---
以下是內容:
{extracted_text}

呼叫方式:在 agent 內直接呼叫 MiniMax-M2 模型(已配置為預設模型,無需額外 API Key)。

如需直接呼叫 MiniMax API:

import urllib.request, json

API_KEY = os.environ.get("MINIMAX_API_KEY")
resp = urllib.request.Post(
    "https://api.minimax.io/v1/text/chatcompletion_pro?GroupId=...",
    headers={"Authorization": f"Bearer {API_KEY}"},
    json={"model": "MiniMax-M2", "messages": [...]}
)

Step 4:上傳圖片到 OSS(逐張)

憑證從 ~/.openclaw/openclaw.jsonskills.entries.getnote 讀取:

import os, json, urllib.request, subprocess

with open(os.path.expanduser("~/.openclaw/openclaw.json")) as f:
    cfg = json.load(f)["skills"]["entries"]["getnote"]

API_KEY = cfg["apiKey"]
CLIENT_ID = cfg["env"]["GETNOTE_CLIENT_ID"]

獲取 token → 上傳 OSS(欄位順序嚴格):

def get_token():
    req = urllib.request.Request(
        "https://openapi.biji.com/open/api/v1/resource/image/upload_token?mime_type=png&count=1",
        headers={"Authorization": f"Bearer {API_KEY}", "X-Client-ID": CLIENT_ID}
    )
    with urllib.request.urlopen(req) as r:
        return json.loads(r.read())

def upload_to_oss(page_path, token_data):
    d = token_data["data"]
    cmd = [
        "curl", "-s", "-X", "POST", d["host"],
        "-F", f"key={d['object_key']}",
        "-F", f"OSSAccessKeyId={d['accessid']}",
        "-F", f"policy={d['policy']}",
        "-F", f"signature={d['signature']}",
        "-F", f"callback={d['callback']}",
        "-F", f"Content-Type=image/png",
        "-F", f"file=@{page_path}"
    ]
    subprocess.run(cmd, capture_output=True)
    return d["access_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![]({url})\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.request.Request(
    "https://openapi.biji.com/open/api/v1/resource/knowledge/note/batch-add",
    data=json.dumps({"topic_id": topic_id, "note_ids": [note_id]}).encode(),
    headers={"Authorization": f"Bearer {API_KEY}", "X-Client-ID": CLIENT_ID, "Content-Type": "application/json"},
    method="POST"
)

推薦快捷指令碼

python3 skills/pdf-to-getnote/scripts/run_pdf_to_getnote.py \
  /path/to/file.pdf \
  "知識庫ID(可選)" \
  "自定義標題(可選)"

憑證自動從 ~/.openclaw/openclaw.json 讀取,無需手動傳入。


憑證配置(不硬編碼)

憑證從 ~/.openclaw/openclaw.json 自動讀取,不再寫在檔案裡:

{
  "skills": {
    "entries": {
      "getnote": {
        "apiKey": "gk_live_xxx",
        "env": {
          "GETNOTE_CLIENT_ID": "cli_xxx"
        }
      }
    }
  }
}

如需更新憑證,修改 ~/.openclaw/openclaw.json 即可。


詳細 SOP 和 API 行為說明

完整流程、API 限制說明、錯誤處理詳見: - references/full_sop.md — 完整執行SOP - references/api_behavior.md — API 關鍵行為發現(2026-04-01實測)

🤖 AI 評測

這個 Skill 質量中等偏上,勝在流程完整、文件清晰。它通過實際測試幫你找出了最穩妥的技術方案,憑證管理也做到了安全規範。主要問題是參考文件裡留有明文金鑰(建議手動刪除),以及 AI 摘要功能還是佔位狀態,沒有真正接好 AI 模型。適合有技術基礎、能自己配環境的使用者使用。

📊 多維度評分

適應性4.4
規範性4.8
有效性4.3
可靠性4.2
可信度5

📁 包含檔案 (5 個)

📄 SKILL.md 5.6 KB
📄 _meta.json 133 B
📄 references/api_behavior.md 2.3 KB
📄 references/full_sop.md 4.7 KB
📄 scripts/run_pdf_to_getnote.py 6.6 KB