惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
CERT Recently Published Vulnerability Notes
U
Unit 42
T
The Blog of Author Tim Ferriss
H
Hackread – Cybersecurity News, Data Breaches, AI and More
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Securelist
L
Lohrmann on Cybersecurity
Blog — PlanetScale
Blog — PlanetScale
Recorded Future
Recorded Future
D
DataBreaches.Net
Spread Privacy
Spread Privacy
T
Threat Research - Cisco Blogs
I
Intezer
P
Palo Alto Networks Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
I
InfoQ
宝玉的分享
宝玉的分享
Security Latest
Security Latest
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Threatpost
Cisco Talos Blog
Cisco Talos Blog
P
Proofpoint News Feed
博客园 - 司徒正美
H
Hacker News: Front Page
Y
Y Combinator Blog
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
NISL@THU
NISL@THU
月光博客
月光博客
有赞技术团队
有赞技术团队
Cloudbric
Cloudbric
酷 壳 – CoolShell
酷 壳 – CoolShell
G
Google Developers Blog
A
Arctic Wolf
博客园 - 【当耐特】
W
WeLiveSecurity
V
Visual Studio Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
V
V2EX
C
Cyber Attacks, Cyber Crime and Cyber Security
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
The Cloudflare Blog
Stack Overflow Blog
Stack Overflow Blog

InfoQ - 促进软件开发领域知识与创新的传播

Meta 收购 Manus 这事儿泡汤了 5.5万 Star 开源项目 Ghostty 被迫出走,GitHub 正在终结一代技术人的乌托邦 谷歌开源“Agent Skill 超级工具箱”,云、库、引擎、AI全线打通,开发者狂喜 Slack 长时运行多智能体系统的上下文管理方案 从 T+1 到分钟级:金城银行基于 Apache Doris 构建高可靠、强一致的实时数据平台 谷歌云推出 Agents CLI,简化 AI 智能体开发全流程 Claude官方击穿高薪、高学历的安全防线!Anthropic点名10大高危职业,但有群人暂时稳了 亚马逊云科技终止 WorkMail 服务,并将 App Runner 转入维护模式 OPPO小布记忆:全模态碎片化内容的理解与智能整理实践|AICon上海 模力工场038周AI应用周榜:工具在消失,工作流在出现 Akamai CEO Tom Leighton:Agent 时代来临,云基础设施正从“中心化”转向“分布式边缘” 日均数百亿入库背后:从“人肉调度”到K8s弹性架构,度小满金融基于OceanBase重构入库架构实践 百度文库网盘发布GenFlow 4.0:月活用户超1亿,要把网盘变成全端AI工作台 Altman 投的 Agent 终端 Warp 开源了!斩获3.5万star 哪些客户需要拒, 敢让龙虾决定吗?_AI&大模型_InfoQ 中文站_InfoQ精选视频 从开发到生产:为什么越来越多的机器学习团队纷纷迁移到 Snowflake | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 探索多智能体工作流:LangGraph Snowflake Cortex AI | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 腾讯云分布式缓存数据库:AI Agent - 从提示词工程到 Harness 工程 | 腾讯云数据库 DBTalk_腾讯_凌敏_InfoQ精选视频 基于 Streamlit 为 CSV 数据构建分析智能体 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 AI 智能体:告别文档缺漏 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 构建 AI 驱动的数据管道:深度探讨 Snowflake Openflow 与非结构化数据 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 云端太贵、本地不够聪明,英特尔押注“端云混合AI”:智能体PC会替人完成工作 不到10%的存储投入,可能拖垮90%的GPU投资!IBM把AI Agent塞进存储系统,算清企业最容易忽略的一笔账 Snowpark 上手实战 | BUILD 2025_大数据_王玮_InfoQ精选视频 ClickHouse + Langfuse,构建 Agent 可观测基石 腾讯云分布式缓存数据库:Cluster Proxy 共享连接架构深度解析 | 腾讯云数据库 DBTalk_腾讯_凌敏_InfoQ精选视频 AI 写代码太烧钱了:Copilot、Claude 一起涨价,不如把程序员请回来? 英特尔发布至强600系列工作站处理器与锐炫Pro B70 GPU,全新AI工作站来了 腾讯云分布式缓存数据库:从 Redis 到 Valkey - 开源社区如何快速创新 | 腾讯云数据库 DBTalk_腾讯_凌敏_InfoQ精选视频 印奇这次要“从0重做”智驾模型!首谈阶跃和千里双公司布局:中国AI商业闭环要靠车跑出来 从Cursor返聘归来,90后华裔女高管带Claude开启日更模式:token成本比工程师工资低多了! 从 Coding 到 Agent:QCon 北京 2026 全景复盘,优秀出品人 & 明星讲师名单揭晓 全链路支撑大模型国产化“Day 0适配”,商汤大装置构建全栈能力底座 凌晨,OpenAI 与亚马逊云科技史上最大联合发布来了 HashiCorp Vault 2.0 发布:引入新身份联邦机制,迈入 IBM 生命周期体系 Yelp 实现超 1,000 个 Cassandra 节点零停机升级 写了 17 年开源代码,我为什么认为 Coding Agents 堆功能是在瞎折腾? 基于 Apache Camel 编排智能体与多模态 AI 管道 面向智能体与人类用户的AI记忆系统:架构设计与核心场景实践|AICon上海 Anthropic 推出 Managed Agents,简化 AI 代理部署流程 阿里HappyHorse开启灰测,720P视频生成低至0.44元/秒 讯飞联合清华团队押注量子AI:不看营收、不设KPI,一群“无人区”科学家,抢夺下代AI算力入口 小米万亿模型全面开源:MIT 协议、1M 上下文,但还是打不过 DeepSeek Cortex Code 入门指南:面向数据工程师的实践路径 | 技术实践 openJiuwen社区首发Team Skills,定义Coordination Engineering新范式 用 Snowflake Cortex Agents 释放结构化数据的最大价值 | 技术实践 Grafana 利用 Kafka 对 Loki 进行了架构重构,并发布了一款命令行工具,旨在将可观测性引入编码代理 ClickHouse重构全文索引:对象存储上跑出高性能 Full-Text Search 可观测性和遥测技术如何提升软件工程实践 Dropbox 与 GitHub 合作,将单体库大小从 87GB 缩减至 20GB Agent 的下一站:基于长期记忆系统 EverOS 的自我演进|AICon上海 同一赛道,四种收费:Agent 控制层(Harness)开始分裂 Cloudflare Sandboxes 正式发布,为 AI 代理提供持久化隔离环境 Agent 的“记忆断片”困局,该怎么破?_AI&大模型_AICon 全球人工智能开发与应用大会_InfoQ精选视频 数据分析师如何快速建立在 AI 时代最值钱的能力:一份可落地的行动路线图 摩尔线程最新财报:研发占比超86%,万卡级大规模智算集群落地 当云区域失效:地缘动荡环境下的高可用重构 Slack 重构通知系统,设置参与度提升 5 倍 智能体工程的隐性技术债务 “我把所有模型都换成了DeepSeek V4”:月账单将降 90%,效果还更好 阿里云智能集团高级技术专家刘少伟已确认出席AICon上海站,并分享如何构建企业 Agent 的自动化行动架构 构建生产就绪的 tRPC API:Apollo Federation 的 TypeScript 替代方案 Anthropic推出面向Claude Code的基于智能体的代码审查功能 北京车展直击:斑马智能甩出车载Agent短剧,比亚迪率先落地,AI让智能座舱又热起来了 Snowflake 作为智能体运行时:从静态管道迈向自主数据系统 | 技术实践 Snowflake 上的本体体系:基于 Cortex Code 能力实现从架构到部署 | 技术实践 Cloudflare 公布 MCP 架构方案,应对企业面临的安全与治理风险 复杂的项目管理怎么做到「AI 友好」?飞书项目用「开放」给出答案 Snowflake Cortex Code 的规范驱动开发:将 SDLC 方法论引入 AI 辅助工作流 | 技术实践 Copilot 不让注册了:从“随便用”到“全面限”,agent 把原有订价模型顶穿了 当互联网用AI卷效率时,这家公司先问了一连串“能不能” Meta 开始记录员工每一次点击:AI 要接管工作,先监控会工作的人 Meta“Token榜”逼疯打工人,一夜烧掉公司几万刀!AI时代Token焦虑越来越离谱 智源FlagOS完成DeepSeek-V4-Flash在八款芯片Day0适配,实现三重技术突破 DeepSeek V4 重磅开源!首次打通华为Ascend,也没丢掉英伟达,百万上下文夺回国产模型话语权 李志飞的“新实验”:当超级个体撞上真实组织 GPT-5.5 登顶时刻,Anthropic 亲口承认 Claude 变笨了!网友群嘲:太敷衍 那些没空写的小需求,龙虾真能做吗?_AI&大模型_InfoQ 中文站_InfoQ精选视频 从 Pandas 到生产:使用任意 IDE 进行可扩展的 ML 数据管道与分布式处理 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 pnpm 11 候选版本发布,带来 ESM 分发、供应链默认设置以及新的存储格式 GPT-5.5 赢了 Opus 4.7 和 Mythos?奥特曼晒黄仁勋内部信:英伟达全员用上 Codex! Cloudflare 推出 Think:一款面向 AI 代理的持久化运行时 1850亿美元天价支出、75%代码由AI生成!谷歌正式宣告:全面转向智能体工作流 xAI落后太多,马斯克“开大”重金求购Cursor,100亿美金“分手费”都敢签! Pulumi 新增对 Bun 运行时的全面支持 姚顺雨腾讯模型首秀!不卷参数只做 “听话打工人”,Hy3 preview登场 | 附实测 老板让你“忽悠”投资人,你敢发给龙虾吗?_AI&大模型_InfoQ 中文站_InfoQ精选视频 Gemini CLI 引入子代理机制,实现任务委派与并行代理工作流 清华系团队星工聚将完成数千万天使轮融资,轮式机器人拿下头部制造企业亿级大单 Pretext.js 绕过 DOM 布局重排,实现 120 FPS 的高级交互体验 靠“AI 云”爆红的 Vercel,栽在一个第三方AI工具手里!IPO前夕遭黑,200万美元赎金谈崩? 高能研讨会|端侧 AI 正在重写实时感知效率上限_AI&大模型_王玮_InfoQ精选视频 2050大会看这篇就够了|报名、交通食宿指引大全 Java 近期资讯:OpenJDK JEP、Jakarta EE 12、Spring Framework、Micrometer、Camel、JBang 金融智能的架构编排:基于 Snowflake Cortex Agents 实现结构化与非结构化数据统一分析 | 技术实践 在AK大神爆火的任务里,摸清国产AI真实水平 百灵Ling-2.6-flash 正式发布:高 Token 效率,以 1/10 消耗实现 SOTA 级 Agent 能力 当 PM 懂AI,当技术懂产品:AI 时代产品力的双向进化|PM x AI产品力领航者大会即将开幕 为 AI 智能体设计记忆机制:揭秘 LinkedIn 的认知记忆智能体 获奖名单公布|2026主题征文第一期|分享你最有价值的龙虾场景与核心 Skill_热门活动_InfoQ写作社区官方_InfoQ写作社区
银行业PDF表格提取方案重构:基于Java的分层方案
作者:Mehuli Mu · 2026-04-24 · via InfoQ - 促进软件开发领域知识与创新的传播

引言:金融服务领域的一个隐性难题

在银行与金融科技领域,技术规划通常聚焦于 API、实时处理、云迁移及人工智能驱动的数据分析。然而,大量核心业务流程仍依赖企业系统中结构化程度最低的文件格式——PDF。银行对账单、交易报告、监管披露材料、开户资料以及客户上传文件不断以 PDF 的格式流入。这些文档需要为分析平台、风险模型、合规审核及客户视角分析提供数据支撑。

关键挑战在于 PDF 的结构。PDF 的设计初衷是保证视觉保真度,而非承载语义化数据。表格很少以标准表格对象的形式呈现,列靠间距来体现,行靠对齐来区分。页眉、页脚、免责声明、横幅等版式元素还经常会打断交易数据区域。这种情况在金融服务行业尤为突出,主要原因包括:对账单来自多家机构与供应商、模板会无预警发生变更、旧版对账单多为扫描图片,以及交易记录经常跨行显示或包含合并单元格。

在生产环境中,信息提取失败并不是个小问题。解析错误可能会传导至偿付能力核查、贷款审批及监管报告等环节,而这些场景均对可审计性和可重复性有严格要求。本文将阐述 PDF 表格提取在规模化应用中失效的原因,说明单一策略的 Java 实现为何在真实业务环境中难以稳定运行,并介绍如何通过架构化方法提升可靠性。

第一种实现方案:流式解析一度有效

在设计银行数据处理流程时,提取金融对账单的需求看似简单:只需要抽取交易表格并映射为相应的数据结构。对于文本型 PDF,常用方案是采用流式解析器,先提取带坐标信息的文本片段,按纵向坐标将片段归为一行,再根据横向区间将行拆分为列,最后将列映射为 DateDescriptionAmountBalance 等字段。

举个简单的例子:

在开发环境中,这种方法或许够用。但在生产环境中,初期暴露的问题往往不是异常或崩溃,而是看似正常、实则列分配错误的数据行。一个典型问题是:当对齐出现微小偏差时,金额与余额列会发生互换,而系统仍正常运行,下游业务也继续信任这个输出。这让我们意识到,PDF 提取并非传统意义上的解析问题,而是输入可靠性问题,我们在设计阶段就必须明确考虑可靠性。

为何流式提取在生产环境中处理对账单会失效

在处理真实的对账单格式时,同样的失效问题会反复出现。这类问题并不限于某一家银行,而是在多家机构和不同的 PDF 生成工具中普遍存在。

布局漂移和不稳定的列边界

流式解析的前提是假设各列拥有固定的横向坐标边界。而在真是的对账单中,横向位置常会因以下原因发生变化:字体与渲染差异、摘要内容宽度不固定、模板更新以及不同的 PDF 生成工具或导出设置的影响。

对人工阅读来说,表格依然清晰可读。但对于依赖横向坐标聚类的解析算法而言,哪怕微小的位置偏移都可能导致数值超出预设的列边界。在实际应用中,仅仅几像素的偏差就会让数据被错误归到其他列中。

跨多行交易记录

交易记录通常并非单行显示,常见的格式包括:

  • 第 1 行(日期 + 描述 + 金额)

  • 第 2 行(描述续行(无日期/金额))

  • 可选第 3 行(参考信息、汇率注释、地点或元数据)

如果把每一行物理行都当作一条交易记录,就会把一笔交易拆分成多条;可如果过度合并,又可能把相邻的交易混在一起。无论采用哪种方式,都需要有明确的多行处理逻辑与校验机制。

混合内容与多类表格区域

对账单中通常还包含其他对齐区域,例如账户摘要、费用明细、利息说明、合计数据或营销横幅。其中不少内容在视觉上与表格相似,若解析器仅依靠对齐方式判断,很可能将其误判为交易表格。对于这种情况,提取过程需要结合语义校验(如页眉识别、字段类型、行数据规律),而不能只依赖几何位置信息。

扫描版 PDF:OCR 让提取变成另一个问题

扫描版对账单没有可直接读取的文本层,流式解析无法奏效,因为不存在可选中的文本和坐标信息。这时必须依赖 OCR,但 OCR 也会带来新的问题,包括:字符识别错误(如 0/O1/l 混淆、小数点丢失)、文本框噪声干扰行列划分、文档倾斜或旋转导致的对齐偏差,以及压缩失真产生的虚假线条或原线条出现断裂。对于这种情况,仅“提取文本”远远不够,还需要从图像像素中重建表格结构,并与 OCR 结果对齐。

首次架构调整:引入 Python(Camelot)

在监管严格的环境中,一种常见的短期方案是在已有的 Java 服务之外引入基于 Python 的提取 API(Camelot),并结合使用面向图片类 PDF 的 OCR 流程。这个工具能够优化部分文档的提取效果,帮助团队判断针对不同类型的 PDF 应该采用哪种提取策略更为合适。

但这种架构需要付出相应的代价,主要包括:额外的运行环境与部署流程、重复的依赖治理和漏洞管理、多服务可观测性与调试开销上升,以及敏感文档在多组件间流转所带来更严苛的处理要求。

这并不是说引入 Python 工具是错误的,而是说提取的可靠性不能只靠选择某一个工具来解决。系统需要一套合适的架构,既能在文档格式多变的情况下稳定运行,又能降低运维成本。

重构方案:基于验证与降级的策略选择

关键的改进在于将“选择最优解析器”的思路转变为“在运行时选取最优结果”,同时绝不隐藏低置信度结果。这种方法需要具备三项能力:

  • 多种提取策略,包括流式提取、表格格线式提取,以及 OCR 处理的变体

  • 可对错误输出进行早期检测的验证与评分机制

  • 明确且可审计的回退行为

这就是构成生产级流水线的架构。

强化的流式解析

流式解析在处理文本型 PDF 时依然有效,区别在于将流式输出视为必须经过验证的候选结果。参考如下伪代码:

流式提取流程

// PSEUDOCODEList<TextBox> boxes = pdfTextExtractor.extract(page);List<Line> lines = clusterByY(boxes);Header header = headerDetector.find(lines); // keyword scoring: Date, Amount, Balance, etc.ColumnModel columns = columnInferer.infer(lines, header);Table table = rowAssembler.assemble(lines, columns);ValidationScore score = validator.score(table);return ExtractionResult.of(table, score, Strategy.STREAM);

复制代码

重要的验证信号

典型验证项包括:页眉检测(或强页眉信号识别)、日期解析成功率、金额与余额列的数值解析成功率、行一致性校验(即预期应填充的列数),以及合理性检查(例如余额解析结果以数值为主,不应被非数字文本主导)。

我们的目标并非追求完美,而是捕捉那些表面有效、实则结构错误的失效模式。

格线解析:有线/扫描表格的网格式抽取方法

对于扫描版对账单与带框线表格,格线解析能够有效提升识别可靠性,原因在于它使用的是视觉结构(边框线条)进行解析,而非依赖文本对齐。参考如下伪代码:

格线提取流程

// PSEUDOCODEBufferedImage image = renderer.render(page);GridLines lines = lineDetector.detect(image);      // horizontal + vertical linesCellMatrix cells = gridBuilder.build(lines);       // joints/intersections -> cell gridList<OcrBox> ocrBoxes = ocrEngine.extract(image);  // text + bounding boxesTable table = cellAssigner.assign(cells, ocrBoxes);ValidationScore score = validator.score(table);return ExtractionResult.of(table, score, Strategy.LATTICE);

复制代码

格线失效模式

格线解析并非万能,它在多种场景下均可能失效,例如:无网格线的空白分隔表格、线条断裂或不完整(如缺少连接点)、水印或阴影产生的干扰线条、存在合并单元格需进行跨列/跨行检测,以及多页表格宽度不一致等。与流式解析同理,关键在于对格线解析的输出结果进行校验,并将其作为候选方案,而非绝对正确的结论。

混合解析:选取最优结果,而非最优解析器

混合解析是面向真实场景多变性而设计的生产级策略。在生产环境中,我们的目标并不是要判定哪种解析技术最优,而是对多组抽取结果进行评估与打分,返回针对当前文档最可靠的结果,并在置信度较低时提供清晰的降级回退方案。参考如下伪代码:

编排器

// PSEUDOCODEExtractionResult stream = streamParser.tryExtract(pdf);ExtractionResult lattice = latticeParser.tryExtract(pdf);ExtractionResult best = chooseBest(stream, lattice);if (!best.score().isAcceptable()) {    return fallbackHandler.lowConfidence(pdf, stream, lattice);}return best;

复制代码

评分输入示例

评分模型不需要太复杂也能达到很好的效果。常见的输入包括:页眉匹配度(关键词与列数匹配情况)、日期和数值列的解析成功率,以及行数是否合理(行数过少或过多)。

实用的设计思路是让评分具备可解释性。当抽取结果被驳回时,系统应明确说明原因(例如日期解析率低于 60%、未检测到页眉、行与行之间列数不一致)。

最重要的原则:绝不隐藏低置信度结果

在金融系统中,提取错误比未提取到结果的后果更为严重。当置信度低于设定阈值时,处理流程应执行以下操作:仅返回带有明确标识的部分结果、转入指定的人工审核或异常处理流程、存储非敏感诊断信息用于问题排查,并在低置信度结果数量激增时触发格式漂移告警。

这种响应措施可以防止数据被静默损坏。

机器学习辅助布局检测:窄场景使用,强约束保障

部分 PDF 可能会同时让流式解析与格线解析失效:这类文件没有清晰的网格线、页面为复杂多栏布局、混杂叙述文本块,还可能带有印章、旋转角度或使用非常规模板。

针对这类情况,机器学习可作为区域分割工具,主要用于检测潜在的表格区域。更稳妥的模式是:由机器学习给出表格边界框,再对框内区域进行解析(结合 OCR 与格线解析或流式解析),随后校验输出结果,若校验不通过则自动触发回退机制。

但在受监管的业务流程中,机器学习不能作为不经核实就直接采信的提取工具。它的作用是缩小搜索范围、优化定位精度,而非绕过确定性校验环节。

Java 优先解决方案的重建:生产级摄入子系统

最终的架构不是一个解析器,而是一个职责分离明确的摄入子系统:

  • 文档分类:文本/扫描件、质量特征值以及页面辅助信息

  • 流式解析器:带有对齐逻辑的文本层提取

  • 格线解析器:带有 OCR 对齐的网格检测

  • OCR 模块:适用于扫描文档的统一文本框接口

  • 混合编排器:运行时策略选择

  • 验证器/评分器:可解释的质量门控

  • 诊断/可观测性:指标、失败原因和可追溯性

输出约定同样关键。我们统一规范了一个标准数据结构,包括:

transactions[](结构化行);

strategyUsed

confidenceScore

warnings[]

parsingDiagnostics(非敏感摘要)。

这种结构让下游调用方将抽取结果视为概率性、可审计的数据,而非盲目采信的结果。

最后,这种设计模式可通过纯 Java 实现,无需引入额外的运行时。例如,我开源了 Java 库 ExtractPDF4J,通过融合多种互补解析策略(流式、格线/OCR)并输出便于校验的结果实现了文中所述的生产环境多变性处理方案。

Java 架构师构建文档摄入管道系统的经验

这些是在生产环境中效果最为显著的实践::

  • 将 PDF 抽取视为可靠性与验证问题,而非单纯的文件格式问题

  • 避免采用单一解析策略;采用流式解析 + 格线/OCR 互补方案

  • 尽早实现验证与评分机制,并保证可解释性

  • 使用明确的回退机制与人工审核通道;不隐藏低置信度结果

  • 完善可观测性(如成功率、置信度分布、主要失败原因及格式漂移告警)

  • 仅在小范围场景使用机器学习做区域分割,且必须经过确定性验证把关

  • 优先优化长期运营成本(安全审查、治理、部署与调试流程),而非只追求抽取准确率

结论:为置信度而设计,而非追求完美

生产环境中 PDF 表格提取失效根源在于金融文档本身存在多变、老旧且格式不统一的问题。常见误区是把它当成只需要更好的工具就可以解决的工程问题。而在实际应用中,系统的可靠性源自整体架构设计:包括分层解析策略、校验机制、评分体系以及明确的回退处理逻辑。

对于银行及金融科技团队而言,目标并非单纯从 PDF 中提取表格,而是确保下游系统能够信任提取的数据,并且知道何时不可信任。这正是演示案例与生产级摄入管道系统的核心区别。

【声明:本文由 InfoQ 翻译,未经许可禁止转载。】

查看英文原文:https://www.infoq.com/articles/redesign-pdf-table-extraction/