paper2skills Playbook

Document Intelligence Parsing — LLM 驱动的文档智能解析:图文统一 OCR、跨页表格恢复、布局感知推理

Skill-Document-Intelligence-Parsing · 22-数据采集工程

causalexperimentforecastingoptimizationragdata_collectionpricingvisual_generation推荐与搜索知识图谱与RAG数据采集与治理定价与利润风控与合规视觉内容生成WF-D 选品扫描WF-F 动态定价
实现难度⭐⭐☆☆☆
业务视角
适用角色数据工程师 / 技术负责人 · 运营负责人 · 选品负责人
适用平台Amazon SP API + Keepa · TikTok Shop API · 跨境多平台数据湖
什么情况下用想监控竞品价格/评论/排名但没有稳定采集能力,手动太慢;多平台数据分散整合成本极高;数据管道不稳定经常断
成功是什么样的竞品价格/评论数据每日自动更新,多平台数据统一入仓,数据管道稳定性 >99%,取数时间从小时降到分钟
业务痛点
竞品数据要手动收集太慢平台 API 限制抓不到数据多系统数据整合不起来报表用的数据是过期的

1. 解决的问题

供应商发来的报价单是 PDF,工厂产能表是 Excel 截图,海关 HS 编码文件是扫描件——这些"已有但不可用"的数据是母婴跨境电商最大的数据孤岛。传统 OCR(Tesseract)只能识别文字,无法理解表格结构、跨页截断、图文混排。

2. 核心算法逻辑

供应商发来的报价单是 PDF,工厂产能表是 Excel 截图,海关 HS 编码文件是扫描件——这些"已有但不可用"的数据是母婴跨境电商最大的数据孤岛。传统 OCR(Tesseract)只能识别文字,无法理解表格结构、跨页截断、图文混排。

3. 业务应用场景

业务背景:每季度收到 15-20 家供应商的 PDF 报价单,每份 5-30 页,包含 SKU 表格(商品名/规格/MOQ/阶梯价格/交期)。目前人工录入需要 3-4 天,错误率约 8%。

业务背景:新品进入欧盟市场前需要检查 CE 声明、REACH 合规报告(通常为 PDF 扫描件),判断是否满足合规要求。

应用效果: - dots.mocr 从合规 PDF 中提取检测项目表格 - Qianfan-OCR 正确识别化学品限制值表格(多层表头:物质名 / 测试方法 / 限制值 / 检测值 / 结论) - 自动对比 REACH 法规阈值 → 生成合规预检报告 - 时间:人工 2h/份 → 自动化 5min/份

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

未自动抽取;请查看原始 Skill 卡片。

7. 代码模板

代码块数量:5 · 路径:未检测到

"""
Document Intelligence Parsing
整合 dots.mocr (图文统一) + Qianfan-OCR (布局推理) + MinerU-Popo (跨页表格)

论文来源:
  dots.mocr:    arXiv:2603.13032
  Qianfan-OCR:  arXiv:2603.13398
  MinerU-Popo:  arXiv:2605.24973
"""

import json
import re
from dataclasses import dataclass, field
from typing import Any, Dict, List, Optional, Tuple
from enum import Enum


class DocumentElementType(Enum):
    TEXT = "text"
    TABLE = "table"
    FIGURE = "figure"
    TITLE = "title"
    LIST = "list"


@dataclass
class TableCell:
    value: str
    row_span: int = 1
    col_span: int = 1
    is_header: bool = False


@dataclass
class ParsedTable:
    headers: List[List[str]]
    rows: List[List[str]]
    caption: str = ""
    page_start: int = 0
    page_end: int = 0
    is_truncated: bool = False

    def to_dicts(self) -> List[Dict[str, str]]:
        if not self.headers or not self.rows:
            return []
        flat_headers = self.headers[-1] if len(self.headers) > 1 else self.headers[0]
        return [
            {flat_headers[i]: row[i] for i in range(min(len(flat_headers), len(row)))}
            for row in self.rows
        ]


@dataclass
class ParsedFigure:
    figure_type: str
    caption: str
    extracted_data: Dict[str, Any] = field(default_factory=dict)
    certifications: List[str] = field(default_factory=list)

8. 论文来源

  • 2603.13032
  • 2603.13398
  • 2605.24973