C# 基于免费PDF库提取类表格PDF指定数据至Excel的问题求助
免费环境下PDF定向字段提取的实现方案
现有实现的核心问题
目前基于LGPL版itextsharp做提取遇到的卡点:
- 第1页带红框标记的两个表格,左侧的地址行完全无法被读取到
- 第2页的目标内容没有标准表格边框,也不处于同一文本行,仅靠空格、制表符分隔内容,表头还被矩形块包裹,原有拆流方式根本抓不准边界
- 直接读取底层流拆分得到的字符串序列和实际视觉阅读顺序不一致,没有位置锚点根本没法对应到要提取的字段
可替换的免费库选型
完全不用局限在当前手动拆流的实现上,无商业限制的免费库就能解决定位问题:
- 优先换用iTextSharp内置的
SimpleTextExtractionStrategy做基础文本抓取,不要直接解析底层流token——当前的写法丢失了每个文本块的坐标信息,自然会出现顺序乱、定位不准的问题 - 如果需要更精准的坐标匹配,可以换同属开源协议的
PdfPig,无付费授权限制,能直接获取每个文本块的X/Y坐标、字号、所属行位置,比手动逐token拆流的效率高很多
针对当前已抓取字符串序列的匹配逻辑
从你调试输出的字符串列表来看,只要做规则匹配就能准确定位6个目标字段,不需要完全重写底层读取逻辑:
- 先做表头锚点识别:当列表中连续出现
Item、number两个条目时,标记为物料明细表的起始位置 - 按锚点顺序匹配对应字段:
- Item number(物料编号):锚点之后第一个纯数字字符串,也就是你列表里索引127对应的
"10" - product number(产品编号):物料编号后面紧跟着的带规格符号的字符串,对应索引128的
"12AG544#AAB" - product description(产品描述):产品编号后面的长文本字符串,对应索引129的
"Some product description goes in here" - quantity(数量):产品描述后面的单个数字字符,对应索引130的
"1" - unit price(单价):数量后面带千分位空格的金额字符串,对应索引132的
" 1 776.00 ",清洗掉首尾空格、千分位分隔符就可以得到有效数值 - Serial ID(序列号):匹配到字符串
"Serial ID :"之后,直到下一个汇总类字符串之前的所有内容,全部按逗号、换行拼接,自动对应到所属的产品条目下
- Item number(物料编号):锚点之后第一个纯数字字符串,也就是你列表里索引127对应的
- 地址行读取优化:之前读不到地址行,是因为底层token拆分把地址行的文本拆成了过碎的单元,换用带坐标的提取策略后,按Y坐标把同一水平高度的文本块拼接,就能完整拿到左侧地址内容
之前直接操作
PRTokeniser拆流的写法,本质是在解析PDF的绘制指令,拿到的是指令执行顺序的字符串,不是人眼看到的阅读顺序——PDF的绘制逻辑根本不按阅读顺序排布,先执行的绘制指令可能对应页面最末尾的内容,这就是你遇到字符串顺序和预期对不上的核心原因,不是代码逻辑写错,是用错了接口的层级。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

