name: pdf-finance-parser description: 解析金融行業 PDF 文件(A股年報、港股財報、美股10-K、招股說明書等)為結構化 Markdown + JSON。專為跨頁表格、無邊框表格、多級表頭、密集數值、多欄排版等金融場景設計。底層呼叫火山 LAS las_pdf_parse_doubao 運算元做通用解析,再經 6 層金融後處理(HTML 表格解析 / 多級表頭 / 跨頁合併 / 數值規整 / 財務術語對齊 / 業務規則校驗)輸出 schema-compliant JSON。 user-invocable: true metadata: {"openclaw":{"emoji":"📊","skillKey":"pdf-finance-parser","requires":{"bins":["python3"],"env":["LAS_API_KEY","TOS_ACCESS_KEY","TOS_SECRET_KEY","TOS_BUCKET"]},"primaryEnv":"LAS_API_KEY","version":"0.3.0","author":"zhuyijun"}}
金融場景 PDF → 結構化 Markdown + JSON。底層呼叫火山方舟 LAS 運算元 las_pdf_parse_doubao 做通用解析,再經 6 層金融後處理還原為符合 assets/output_schema.json 的業務 JSON(含 value/unit/source_page/validation)。
輸入歸一化 → LAS submit/poll → HTML 表解析 → 多級表頭 → 跨頁合併 → 數值規整 → 財務術語對齊 → 業務校驗 → schema-compliant 輸出LAS_API_KEY(火山方舟 LAS)TOS_ACCESS_KEY / TOS_SECRET_KEY / TOS_BUCKETcn-beijing(LAS 預設 region),需要 export TOS_REGION="<region>" 單獨指定(tos:// 協議跨 region 由 LAS 解析)tos_uploader.py 做 ASCII sanitize--pages 1-50 分段cross_page_merger.py 自動合併;想關掉後處理傳 --no-postprocess複製此清單並跟蹤進度:
解析進度:
- [ ] 步驟 0:確認解析模式(normal / detail)
- [ ] 步驟 1:環境就緒(venv + env.sh 憑證)
- [ ] 步驟 2:執行 parse-las
- [ ] 步驟 3:檢查 meta.json.postprocess + output.json.validation
- [ ] 步驟 4:按"結果回覆模板"彙報
請選擇 PDF 解析模式:
| 模式 | 說明 | 價格 |
|--------|-----------------------------------------------|-----------|
| normal | 預設,單次推理,速度更快,適用於結構清晰的文件 | 0.02 元/頁 |
| detail | 深度分析,對複雜表格/掃描件/印章精度更高 | 0.04 元/頁 |
推薦:A股/港股標準年報選 normal;財報附註、合併報表跨頁、掃描合同選 detail。
normalcd {skill_directory} && \ (test -d .venv || (python3 -m venv .venv && \ .venv/bin/pip install -r ../../requirements.txt)) && \ .venv/bin/python3 scripts/skill.py info7w4.net小蔥技能。
info 命令驗證 VLM 配置(仍用於 v0.2 fallback 路徑的健康檢查)。
首次使用必須先填好 env.sh —— 把 LAS_API_KEY / TOS 憑證替換成你自己的值。
框架會在 skill 目錄自動載入 env.sh,無需手動 source。
.venv/bin/python3 scripts/skill.py parse-las \
--input <pdf_path | http(s)://... | tos://bucket/key> \
--output <output_dir> \
--parse-mode normal
{"status":"COMPLETED","task_id":"...","page_count":N,"table_count":N,"postprocess":{...},"preview":"..."}--no-postprocess 跳過(通用文件場景)meta.json 必讀欄位:
| 欄位 | 含義 | 處理 |
|---|---|---|
status |
COMPLETED / FAILED | FAILED 時看 error_msg |
page_count / table_count |
LAS 解析的頁數 / 表格數 | 對比 GT 檢查漏抽 |
postprocess.merged_table_count |
跨頁合併後的表數 | 通常 < raw_table_count 表示有合併 |
postprocess.validation_warning_count |
業務規則不一致計數 | > 0 時看 output.json 的 tables[].validation |
wall_time_seconds |
端到端耗時 | 評測對比用 |
output.json 關鍵 sub-field(v0.3 新增):
tables[].statement_type:balance_sheet / income_statement / cash_flow / equity_changetables[].declared_unit:從表頭宣告文本中識別的單位(如 "百萬元")tables[].column_paths:每列多級表頭展平的 path(如 "本集團 / 2026年3月31日(未經審計)")tables[].source_pages:跨頁合併後的源頁號陣列tables[].validation:業務規則校驗結果(warnings 列表)✅ 解析完成
📄 文件資訊
- 檔案:{filename}
- 頁數:{page_count} | 表格:{table_count}(合併後 {postprocess.merged_table_count})
- 模式:{parse_mode} | 耗時:{wall_time}s
📁 輸出
- 業務 JSON:{output_dir}/output.json(符合 assets/output_schema.json)
- 整篇 Markdown:{output_dir}/output.md
- LAS 原始響應:{output_dir}/result.full.json
- 單頁 markdown:{output_dir}/pages/p{N}.md
⚠️ 注意(若有)
- 業務規則 {N} 處不一致:檢視 output.json.tables[].validation.warnings
{output_dir}/
├── output.json # ★ 金融業務 JSON(cells 含 value/unit/source_page/validation)
├── output.md # 整篇 markdown(≈ result.md)
├── meta.json # task_id / wall_time / postprocess 摘要
├── result.md # LAS 原始 markdown(表格為 HTML <table>)
├── result.full.json # LAS 完整響應(含 detail[].text_blocks / bbox)
└── pages/
├── p1.md # 單頁 markdown(評測 / 對比用)
├── p2.md
└── ...
| 層 | 模組 | 職責 |
|---|---|---|
| 1 | html_table_parser.py | BS4 解析 LAS 的 <table>,rowspan/colspan 展開為網格 |
| 2 | multi_header_detector.py | 數 header_rows + 計算每列 column_path |
| 3 | cross_page_merger.py | (續) 關鍵詞 + 列結構匹配 → 多張分頁表合一 |
| 4 | numeric_normalizer.py | 千分位 / (負數) / 萬/億/百萬元 / percent / -→null |
| 5 | finance_terms_aligner.py | statement_type 識別 + group / subtotal / grand_total 關鍵詞 |
| 6 | finance_validator.py | 資產 = 負債 + 權益、Σ明細 = subtotal(best-effort,標 warning 不修值) |
| 現象 | 來源 | 處理 |
|---|---|---|
LAS_API_KEY 未配置 |
env.sh 缺失或未載入 | 檢查 skill 目錄下 env.sh 是否存在、值是否非佔位符 |
TOS_BUCKET 未配置 |
TOS 憑證缺失 | 同上;如桶在非 LAS region,再 export TOS_REGION |
NoSuchBucket / 404 |
桶名拼錯 / region 不一致 | 用 clawhub auth whoami 或 TOS 控制台確認桶 region,更新 TOS_REGION |
Url.Invalid |
TOS key 含特殊字元 / 跨 region 拉不到 | tos_uploader.py 已 sanitize;若仍出現,檢查 TOS 桶是否在 LAS region |
LAS task 持續 RUNNING 不返回 |
單次大文件 | 已自動退避;超過 max-poll-attempts (60×30s) 仍未返回 → 拆分頁範圍 |
validation_warning_count > 0 |
業務規則不一致 | 看 output.json.tables[].validation.warnings;不阻塞流程,best-effort |
Url.Invalid: invalid url tos://... 含中文 |
中文路徑未 sanitize | 已修,若復現請上報 |
.venv/bin/python3 scripts/skill.py parse-las \
--input <pdf> --output <dir> --pages 1-10
LAS 僅支援連續頁範圍(start_page + num_pages),不支援 1,3,5 離散頁。
detail 模式(2× 價,更精細).venv/bin/python3 scripts/skill.py parse-las \
--input <pdf> --output <dir> --parse-mode detail
.venv/bin/python3 scripts/skill.py parse-las \
--input <pdf> --output <dir> --no-postprocess
只生成 result.md / result.full.json / pages/,不生成 output.json。適合非金融場景或想觀察 LAS 原始輸出。
# 批次預測(倉庫內 evaluation/scripts/)
python3 evaluation/scripts/run_lasbench_predictions.py \
--images-dir <dataset>/images --out-dir <pred_dir>
# 一鍵算指標
python3 evaluation/scripts/run_omnidocbench_eval.py \
--gt <gt.json> --pred-dir <pred_dir> --out <report.json>
# 渲染 HTML 報告
python3 evaluation/scripts/render_omnidocbench_report.py \
--input <report.json> --output <report.html>
1,234 → value=1234(去千分位 + 按宣告單位歸一化到 yuan),但不做上下文猜測source_page,跨頁合併錶帶 source_pages[]這是一款功能比較完善的金融 PDF 解析工具,能較好處理年報、財報中的複雜表格和多頁報表,輸出結構化 JSON。優點是支援多種模型、配置靈活、數值處理細緻。缺點是配置過程較複雜,需要申請多個 API 金鑰,對新手不太友好;解析長文件時速度較慢,且文件中部分功能說明與實際表現存在細微差異。總體適合有技術基礎的使用者使用。