跳转到内容
原创教程官方文档整理

Docling PDF 表格转 CSV:保留来源再逐项复核

关联原件的候选表格、manifest 和复核记录。

适用场景导出 PDF 候选表格为 CSV 与 HTML,记录原文件哈希和表序号,再检查合并单元格、跨页表头和金额列;附复核清单。

来源 · JevLog 编辑部Intermediate15 分钟

导出 PDF 候选表格为 CSV 与 HTML,记录原文件哈希和表序号,再检查合并单元格、跨页表头和金额列;附复核清单。

来源 · JevLog 编辑部 · 本站原创

原页面项目标识 · Docling

2026-10-02 新增:依据当前官方文档整理,附本站编写练习。未做真实服务调用;来源首次发布日期未确认。

复制表格时数字还在却错列,往往比少一行更难发现。先导出候选与视觉视图,再回原 PDF 核对。Jev 可后续分流待复核项,不能凭空恢复缺失数字。

  • 安装 Python、docling 与 pandas;第一次运行可能下载模型并占较多内存。

  • 挑有权限的短 PDF,另存 input.pdf;下载 table-review-checklist.csv。

  • 官方文档

JevLog 原创流程图,非产品截图或实测结果。

JevLog 原创流程图,非产品截图或实测结果。

选 1–3 页且表头清楚的文件,人工记页码、行列数和一行关键值。先不选几百页扫描件,避免解析、OCR 和资源不足混在一起。

代码只读本地文件,输出到新目录。manifest 记录原件哈希、表序号、行列数和输出名;表序号不等于原页码,页码由复核清单补充。

from pathlib import Path
import hashlib, json
from docling.document_converter import DocumentConverter
source = Path("input.pdf")
out = Path("table-output")
out.mkdir(exist_ok=True)
document = DocumentConverter().convert(source).document
digest = hashlib.sha256(source.read_bytes()).hexdigest()
records = []
for i, table in enumerate(document.tables, 1):
frame = table.export_to_dataframe(doc=document)
frame.to_csv(out / f"table-{i}.csv", index=False, encoding="utf-8-sig")
(out / f"table-{i}.html").write_text(table.export_to_html(doc=document), encoding="utf-8")
records.append({"source": source.name, "source_sha256": digest,
"table_index": i, "rows": len(frame), "columns": len(frame.columns)})
(out / "manifest.json").write_text(json.dumps(records, indent=2), encoding="utf-8")

HTML 看表头、合并关系和列错位,CSV 看列数与数据。跨页表头可能被当成数据行;金额、日期、百分号先保留原字符串,确认币种、负号和空白含义后再转类型。

分别核第一行、跨页附近和最后一行,记录 original_page、table_index、issue、status、reviewer。不要因为解析成功就默认所有表格正确;资料缺失明确标 pending。

已核对部分另存 accepted.csv,其余继续作为候选。结构坏行接 DuckDB,业务类别接 Jev。报销和金额审批仍需原件与授权流程,不能用解析结果代替签字。

练习样例:下载 table-review-checklist.csv,可在本地练习;非本站实测结果。

关联原件的候选表格、manifest 和复核记录。

  • 没检测出表格不证明原件没有表格;扫描质量和版式影响解析。
  • 表格应用可能解释公式文本,外部单元格按不可信输入处理。
  • 每个输出能回原文件哈希和表序号。
  • 至少三处核对并保留未确认项。

来源边界:依据所列公开来源整理;本站未复现演示。分类结果需人工复核,不会自动执行。

HTML 便于核对表头与合并关系,CSV 便于处理;两者仍须对照原 PDF。