PDF表格提取服务器

TableShot是一款专为PDF表格提取设计的MCP服务器,无需编写代码即可为AI助手提供表格读取能力。

  • by Bespoke34
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 bespoke34/tableshot

使用说明

TableShot

用于PDF表格提取的唯一MCP服务器。 让任何人工智能助手都能从PDF中读取表格——没有其他工具能做到这一点。

Camelot、Tabula和Table Transformer是Python库,它们需要开发人员编写代码。TableShot是一个MCP服务器:Claude Desktop、Cursor和Windsurf可以直接使用它,无需任何代码。

安装约33MB。没有模型下载。没有API密钥。结果<100ms。

问题

让任何AI助手从PDF中读取表格。它不能——你得到汤这个词:

Sales Report Q1 2024 Product Price Quantity Total Widget A $10.00 100
$1,000.00 Widget B $25.50 50 $1,275.00 Widget C $5.99 200 $1,198.00

TableShot为您呈现:

产品 价格 数量 总计
小部件A 10.00美元 100 1000.00美元
小部件B 25.50美元 50美元 1275.00美元
小部件C 5.99美元 200美元 1198.00美元
小部件D 149.00美元 10 1490.00美元

快速开始

克劳德桌面/光标/风帆

添加到MCP配置中:

{
  "mcpServers": {
    "tableshot": {
      "command": "uvx",
      "args": ["tableshot"]
    }
  }
}

然后问: “从/path/to/report.pdf中提取表格”

点

pip install tableshot

作为独立的MCP服务器运行:

tableshot              # stdio transport (for MCP clients)
python -m tableshot    # same thing

工具

工具 它做什么
extract_tables 将所有表提取为Markdown、CSV、JSON或HTML格式
list_tables 快速扫描——提取前预览表格

extract_tables

source: str           # File path or URL to a PDF (or image with [ml] extra)
pages: str = "all"    # "all", "1", "1-3", "1,3,5"
format: str = "markdown"  # "markdown", "csv", "json", "html"

list_tables

source: str           # File path or URL to a PDF
pages: str = "all"    # "all", "1", "1-3", "1,3,5"

返回找到的每个表的表计数、维度、标题和预览行。

例子

财务报告(带边框的表格)

输入: 贝莱德风格的季度收益PDF

输出(降价):

|                                      | Q3 2023    | Q3 2022    | 9M 2023    | 9M 2022    |
| ------------------------------------ | ---------- | ---------- | ---------- | ---------- |
| Total revenue                        | $4,522     | $4,311     | $13,228    | $13,536    |
| Total expense                        | 2,885      | 2,785      | 8,538      | 8,578      |
| Operating income                     | $1,637     | $1,526     | $4,690     | $4,958     |
| Operating margin                     | 36.2%      | 35.4%      | 35.5%      | 36.6%      |

提取于 25毫秒.

多表文档

输入: PDF与员工目录+预算摘要在同一页面上

输出: 这两个表都是用正确的标题分别提取的:

Table 1: 3 rows x 3 cols (Name, Department, Email)
Table 2: 4 rows x 2 cols (Category, Amount)

宽桌(8列,横向)

| ID  | Name  | Q1  | Q2  | Q3  | Q4  | Total | Status |
| --- | ----- | --- | --- | --- | --- | ----- | ------ |
| 1   | Alpha | 100 | 150 | 200 | 250 | 700   | Active |
| 2   | Beta  | 90  | 110 | 130 | 170 | 500   | Active |
| 3   | Gamma | 0   | 0   | 50  | 80  | 130   | New    |

所有4种输出格式(Markdown、CSV、JSON、HTML)均可用于每次提取。

基准测试

在10个PDF文件上进行了测试,涵盖了有边框的表格、多表格页面、多页面文档, 特殊字符、宽表和真实财务报表。

度量 结果
带边框的表格精度 8/8完全匹配
速度(带边框的表格) 每次提取4-25ms
速度(3页财务PDF) 182毫秒
输出格式有效性 36/36通行证(9份PDF x 4种格式)

测试数据

生成的夹具--单击 来源 为了查看输入的PDF, 输出 查看TableShot提取的内容:

夹具 描述 来源 输出 速度
simple_bordered 4列销售报告(产品、价格、数量、总计) PDF 提取 10ms
multi_table 一页两表:员工目录+预算汇总 PDF 提取 10ms
single_row 最小表--表头+一个数据行 PDF 提取 4ms
multi_page 每页一张表,共2页 PDF 提取 9毫秒
empty_page 仅第1页文本;第2页有一张表 PDF 提取 6ms
special_chars 带有 $, :, ", &, <> PDF 提取 6ms
wide_table 8列横向表格(第1季度至第4季度,总计,状态) PDF 提取 11毫秒

真实世界的PDF(由于大小/许可,不包括在仓库中):

PDF 描述 表格 速度
贝莱德模拟 生成贝莱德季度收益表的模拟(5列) 1个表,11行 25ms
财务报表示例 具有复杂视觉格式的3页财务报表(155KB) 3个表,75行 182ms
NHM表格 包含55个表格的56页大文档(25MB) 55个表格,2321行 5.8秒

完全机器可读的结果 benchmarks/results.json.比较前后的详细信息请参见 基准/结果.md.

vs其他工具

TableShot Camelot Tabula py 表格转换器
安装 ~33MB,无其他 需要Ghostscript 需要Java(100-300MB) 需要PyTorch(700MB-5GB)
速度 ~10ms/表 >20s最坏情况 变量(JVM启动) 2-5s/页
带边框的桌子 优秀 优秀 良好 优秀
无界 良好(文本回退) 较差 更好的检测 最佳
MCP支持 本地 无 无 没有
维护 活跃 ~5年过时 活跃 活跃

竞争对手数据来自 阿迪卡里和阿加瓦尔2024,OpenNews 2024评论,并发布了GitHub指标。完整结果 基准/结果.md.

需要扫描的PDF或图像?

基本安装处理带有文本层的原生PDF(90%以上的实际用例)。 对于扫描的文档和图像:

pip install tableshot[ml]     # Table Transformer for image-based tables
pip install tableshot[ocr]    # OCR for scanned documents (ONNX, no PyTorch)
pip install tableshot[all]    # Everything

随着 [ml] 安装后,TableShot会自动检测PDF是否有文本层:

  • 文本层存在 --使用pdfplumber(快速,~10ms)
  • 扫描/无文本层 --使用Table Transformer进行检测,使用pdfplumber进行文本提取
  • 图像文件 (PNG、JPEG)-使用表格转换器+OCR(需要 [ocr])

您还可以强制ML后端: extract_tables("/path/to/scan.pdf", backend="ml")

运作原理

PDF/Image ──> Smart Router ──> Table Detection ──> Cell Extraction ──> Formatted Output
                  |                                                        |
                  |  PDF with text layer:                                  |  Markdown
                  |    pdfplumber (lines → text fallback)                  |  CSV
                  |                                                        |  JSON
                  |  Scanned PDF / Image (with [ml]):                      |  HTML
                  |    Table Transformer → pdfplumber text / OCR           |
  • pdfplumber 处理PDF解析和表检测(MIT)
  • pypdfium2 将PDF页面渲染为ML后端的图像(Apache-2.0)
  • 变压器表 (可选 [ml])检测图像中的表格(MIT)
  • MCP-SDK 通过stdio传输将工具暴露给AI助手(MIT)

基本安装总量:~33MB。没有模型下载。无需GPU。

已知限制

所有基于规则的PDF表格提取器(包括Camelot和Tabula)都有这些限制:

  • 具有视觉格式的财务报表 --由空格而非单元格边框定位的金额可能会在列之间分割
  • 扫描的PDF/图像 --基本安装中没有OCR(使用 tableshot[ml] 或 tableshot[ocr])
  • 含有方程式的科学论文 --内联数学中断表边界检测
  • 复杂的无边框表格 --列对齐不明确会导致误检测

我们对此是诚实的。对于边缘情况, tableshot[ml] 添加了Table Transformer支持。

贡献

git clone https://github.com/Bespoke34/tableshot.git
cd tableshot
pip install -e ".[dev]"
pip install fpdf2                 # for generating test fixtures
python tests/generate_fixtures.py # create test PDFs
pytest -m "not slow"              # run 160 tests (skip ML tests)
pytest                            # run all 167 tests (needs [ml] extra)
ruff check src/ tests/            # lint
  • 95%的测试覆盖率,所有测试必须通过
  • 抹布干净,无绒布警告
  • MIT许可证——所有依赖项必须与MIT/Apache-2.0/BSD兼容

许可证

麻省理工学院