
把供应商发来的采购单 PDF 整理成表格时,同一种物料可能写“12 件”,也可能写“2 箱”。如果汇总表按“件”统计,只提取数字就会丢掉数量的含义。
整理时应一起保留数量、单位和换算依据。“2 箱”需要先确认每箱件数,再换算成件;数量未填写时,应标记为缺失,不能用 0 补齐。处理好这些差异,汇总表里的数字才有相同的统计口径。
下面以按整数件数管理的物料为例,说明从原文核对、字段整理到单位换算的处理方法,并提供 Python 数量检查示例。读者可以用自己的获准文件,检查单位不一致、零值和缺失信息分别会得到什么结果。
PDF 解析解决的是从文档中取得内容和结构。它提供的数字,需要结合原文里的单位和业务含义判断。
可以先准备三类输入,分别查看解析结果:
原文内容 | 需要保留的信息 | 后续动作 |
|---|---|---|
支架 12 件 | 数量 12、单位“件”、原文位置 | 按件数检查 |
支架 2 箱,每箱件数未填写 | 数量 2、单位“箱”、换算关系缺失 | 待确认 |
赠品 0 件 | 数量 0、单位“件” | 保留零值,再按业务规则确认 |
以文档解析接口为例,ComPDF 智能全文解析接口参考说明了请求与返回结构。应用需要从实际返回结果中整理业务字段。先检查结果是否保留了数量、单位及其对应关系;不要看到一个数字就脱离上下文填入业务表。
建议将源 PDF、解析结果和整理后的业务字段分开保存。业务记录至少保留来源文件、页码或原文片段,人工修改时能找回依据。字段名、表格位置与返回结构应按实际输出适配,不能假定所有文档都返回同一套业务字段。
下面的 Python 示例只处理“件”和“箱”,要求数量为非负整数、每箱件数为正整数。它适用于本例的整件物料;称重物料、允许半箱的业务应另定规则。
from decimal import Decimal, InvalidOperation
def whole_number(value, minimum):
try:
number = Decimal(str(value))
except (InvalidOperation, ValueError):
return None
if not number.is_finite():
return None
if number < minimum or number != number.to_integral_value():
return None
return number
def review_quantity(value, unit, pieces_per_box=None):
if value is None or (isinstance(value, str) and not value.strip()):
return {"status": "needs_review", "reason": "missing_quantity"}
quantity = whole_number(value, 0)
if quantity is None:
return {"status": "needs_review", "reason": "invalid_quantity"}
if unit == "件":
pieces = quantity
elif unit == "箱":
if pieces_per_box is None:
return {"status": "needs_review", "reason": "missing_conversion"}
factor = whole_number(pieces_per_box, 1)
if factor is None:
return {"status": "needs_review", "reason": "invalid_conversion"}
pieces = quantity * factor
else:
return {"status": "needs_review", "reason": "unknown_unit"}
return {"status": "quantity_checked", "pieces": format(pieces, "f")}
cases = [
("正常件数", "12", "件", None),
("明确换算", "2", "箱", "12"),
("零值", "0", "件", None),
("缺少数量", None, "件", None),
("缺少换算", "2", "箱", None),
("未知单位", "2", "包", None),
("无效数量", "-1", "件", None),
("无效换算", "2", "箱", "0"),
]
for name, value, unit, factor in cases:
print(name, review_quantity(value, unit, factor))保存为 check_quantity.py,用 Python 3 运行 python3 check_quantity.py。正常件数应得到 12 件,明确换算应得到 24 件,零值应保留为 0;其余示例进入待确认并给出原因。
pieces 使用字符串,便于后续按目标系统的数字类型明确转换。这段代码是应用层的教学规则,没有调用解析接口,也没有执行入库。quantity_checked 只表示数量这一项完成检查,料号、供应商、订单版本等仍要分别核对。
“待确认”不应只是弹出一个确认按钮。缺少换算关系时,界面应同时展示原文“2 箱”、来源页和缺失原因,让处理人根据供应商资料或物料主数据补充依据。
如果补成“每箱 12 件”,应记录依据、确认人和修改前后的值,再重新执行换算。不同料号、包装规格或生效日期的换算关系不能随意共用。
零值也需要区别对待。“赠品 0 件”和“数量未填写”含义不同。前者可能是明确记录,后者是缺失;如果业务不接受零数量,应在下一层规则中拒绝,不能先用默认值把两者合并。
先拿一份正常文件和一份异常文件,小范围完成下面四步:
最后再核对业务编号、权限、重复提交和导入接口约束。解析服务负责取得文档内容,应用负责决定字段能否进入业务系统。把这两层分开,才能知道错误发生在识别、字段整理还是业务判断,也便于处理人员有依据地修正。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。