📄

PPT圖片內容識別

👤 Yuki_Ginko 📦 v1.0.0 ⭐ 0.0 ⬇️ 406 下載
📄 辦公效率 免費

📖 技能介紹


name: ppt-image-extract slug: ppt-image-extract displayName: PPT圖片內容識別 description: 讀取 PPT 內容:匯出每頁為 PNG + 用多模態模型識別圖片內容。基於 tiangong-wps-ppt-automation。 status: live version: "1.0.0" date: "2026-07-02"


ppt-image-extract

讀取 PPT 內容(含圖片識別):匯出每頁為 PNG + 呼叫多模態模型識圖。

觸發場景

  • 使用者說「讀取 PPT 內容」「識別 PPT 裡的圖」「把 PPT 轉成文字」
  • PPT 包含梯形圖、電路圖、實物圖、流程圖等無法用純文本提取的內容
  • 需要把圖片中的知識點整理為文字

前置條件

  1. Windows 系統(用 WPS/PowerPoint COM 匯出圖片)
  2. 已安裝 tiangong-wps-ppt-automation skill(提供 COM 自動化基礎)
  3. 已安裝 pywin32pip install pywin32
  4. 多模態模型(用於識圖,任選其一):
  5. qclaw/pool-minimax-m3(已驗證可用)
  6. qclaw/kimi2.6(已驗證可用)
  7. 其他支援圖片輸入的模型

核心流程

PPT (.ppt/.pptx)
    ↓ 步驟1: COM 自動化匯出每頁為 PNG
slides/<ppt名>/slide_001.png ~ slide_NNN.png
    ↓ 步驟2: 多模態模型逐張識圖
識別結果(結構化文字)
    ↓ 步驟3: 彙總成文件
output.docx / output.md

步驟 1:匯出 PPT 每頁為 PNG

1.1 用 WPS COM(推薦,支援 .ppt 舊格式)

import os
import win32com.client

def export_ppt_to_png(ppt_path, output_dir):
    """用 WPS 演示 COM 把 PPT 每頁匯出為 PNG"""
    assert os.path.exists(ppt_path), f'PPT not found: {ppt_path}'

    ppt_name = os.path.splitext(os.path.basename(ppt_path))[0]
    out_folder = os.path.join(output_dir, ppt_name)
    os.makedirs(out_folder, exist_ok=True)

    print(f'PPT: {ppt_path}')
    print(f'Output: {out_folder}')

    # 優先用 WPS(支援 .ppt 舊格式),fallback 到 PowerPoint
    try:
        app = win32com.client.Dispatch('KWPP.Application')
    except:
        app = win32com.client.Dispatch('PowerPoint.Application')

    app.Visible = True  # WPS 必須可見

    try:
        pres = app.Presentations.Open(ppt_path, ReadOnly=True, WithWindow=False)
        total = pres.Slides.Count
        print(f'Total slides: {total}')

        for i, slide in enumerate(pres.Slides, 1):
            out_path = os.path.join(out_folder, f'slide_{i:03d}.png')
            slide.Export(out_path, 'PNG', 1920, 1080)
            if i % 20 == 0:
                print(f'  exported {i}/{total}')

        pres.Close()
        print(f'✅ Done: {total} slides exported to {out_folder}')
        return out_folder, total
    finally:
        app.Quit()

1.2 批次處理多個 PPT

def export_all_ppts(folder, output_root='slides'):
    """批次匯出資料夾下所有 PPT"""
    ppts = [f for f in os.listdir(folder) if f.lower().endswith(('.ppt', '.pptx'))]
    print(f'Found {len(ppts)} PPTs')

    results = {}
    for ppt in ppts:
        ppt_path = os.path.join(folder, ppt)
        out_folder, count = export_ppt_to_png(ppt_path, output_root)
        results[ppt] = (out_folder, count)

    return results

1.3 驗證匯出

def verify_exports(results):
    """驗證每個 PPT 的匯出數量"""
    for ppt_name, (folder, expected) in results.items():
        actual = len([f for f in os.listdir(folder) if f.endswith('.png')])
        status = '✅' if actual == expected else '❌'
        print(f'{status} {ppt_name}: expected {expected}, got {actual}')

步驟 2:多模態模型識圖

2.1 單張圖識別(在主會話中用 read 工具)

重要:模型必須支援圖片輸入。當前驗證可用的模型: - qclaw/pool-minimax-m3(MiniMax M3,原生多模態) - qclaw/kimi2.6(Kimi K2.6,視覺理解)

呼叫方式(在 agent 主迴圈中):

# 用 read 工具讀取 PNG,模型會自動識別圖片內容
read(path="C:/path/to/slide_001.png")

注意read 工具對圖片返回的是模型識圖結果,不是檔案二進位制。需要模型本身支援多模態。

2.2 批次識圖策略

不要在主會話中逐張識圖(會汙染上下文 + 速度慢)。

推薦方式:派子 AGENT 處理,主會話只接收匯總結果。

sessions_spawn(
  task=<識圖任務描述,包含圖片路徑清單 + 期望輸出格式>,
  model="qclaw/pool-minimax-m3",
  runtime="subagent",
  mode="run"
)

2.3 子 AGENT 識圖任務模板

# 任務:識別 PPT 圖片內容

## 圖片清單
- C:/path/to/slides/plc第七講/slide_011.png — PLC 三段等效電路
- C:/path/to/slides/plc第七講/slide_013.png — 核心轉換案例
...(列出所有要識別的圖)

## 輸出要求
對每張圖輸出:
1. 圖片標題(來自 slide 編號)
2. 圖片型別(電路圖/梯形圖/實物圖/文字說明/混合)
3. 關鍵內容描述(200-400 字)
   - 電路圖:列出主要元件 + 連線關係
   - 梯形圖:列出 LD/AND/OR/OUT 等指令 + 梯形圖結構
   - 實物圖:列出裝置型號 + 關鍵特徵
   - 文字說明:直接摘錄關鍵文字
4. 對應考點(如適用)

## 輸出格式
Markdown 文件,每張圖一段:

### slide_NNN.png
- **型別**:電路圖
- **描述**:...
- **考點**:考點 4

2.4 進度控制

  • 每個子 AGENT 處理 10-20 張圖(避免上下文超限)
  • 多個子 AGENT 可並行(OpenClaw 支援 maxConcurrent: 8
  • 主會話用 sessions_yield 等待全部完成

步驟 3:彙總成文件

3.1 收集子 AGENT 結果

7w4.net收錄了海量優質技能外掛。

子 AGENT 完成後會把識別結果寫檔案或返回報告。主會話:

import glob

results = []
for f in glob.glob(r'C:\path\to\work\*_result.md'):
    with open(f, 'r', encoding='utf-8') as fp:
        results.append(fp.read())

final = '\n\n---\n\n'.join(results)

3.2 生成 docx(可選)

如果需要嵌入圖片 + 文字到 docx:

from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH

doc = Document()

for item in image_results:
    doc.add_heading(item['title'], level=2)

    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.add_run().add_picture(item['image_path'], width=Inches(5.5))

    cap = doc.add_paragraph()
    cap.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = cap.add_run(f"圖:{item['caption']}")
    run.italic = True
    run.font.size = Pt(9)
    run.font.color.rgb = RGBColor(0x55, 0x55, 0x55)

    doc.add_paragraph(item['description'])

doc.save(output_path)

常見問題

Q1: WPS COM 啟動失敗

  • 確認 WPS Office 已安裝
  • KWPP.Application(WPS)→ PowerPoint.Application(Microsoft)→ wpp.Application(WPS 新版)
  • WPS 必須設為 Visible=True(COM 限制)

Q2: .ppt 舊格式匯出失敗

  • WPS 支援 .ppt,Microsoft PowerPoint 需要先另存為 .pptx
  • 也可以先用 LibreOffice soffice --convert-to pptx 轉換

Q3: 模型不支援圖片識別

  • 當前 qclaw/pool-glm-5.2(預設模型)不支援圖片識別
  • 必須切換到多模態模型:qclaw/pool-minimax-m3qclaw/kimi2.6
  • sessions_spawn(model="qclaw/pool-minimax-m3") 指定子 AGENT 的模型

Q4: 子 AGENT 識圖超時

  • 單個子 AGENT 處理圖片數 ≤ 20 張
  • 大批次(>50 張)拆成多個子 AGENT 並行
  • mode="run" 讓子 AGENT 後臺執行

Q5: 識別結果不準確

  • 提供清晰的圖片標題/上下文("這是 PLC 第七講第 13 頁,主題是核心轉換案例")
  • 對關鍵圖可以多次識別取共識
  • 識別後讓使用者校對

檔案路徑約定

<工作目錄>/
├── slides/                       # 匯出的 PNG
│   ├── <PPT名1>/
│   │   ├── slide_001.png
│   │   ├── slide_002.png
│   │   └── ...
│   └── <PPT名2>/
│       └── ...
├── _recognize_results/           # 子 AGENT 輸出
│   ├── batch1_result.md
│   └── batch2_result.md
└── output.docx                   # 最終彙總文件

依賴 skill

  • tiangong-wps-ppt-automation(提供 PPT COM 自動化基礎,但不含圖片識別
  • 本 skill 補充了「圖片識別」能力

限制

  • 僅 Windows(依賴 WPS/PowerPoint COM)
  • 識圖精度依賴多模態模型,複雜梯形圖可能漏細節
  • 大批次 PPT(>500 頁)耗時較長,建議分批處理
  • 匯出的 PNG 解析度預設 1920×1080,可調整

📁 包含檔案 (1 個)

📄 SKILL.md 8.4 KB