首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PDF 采购单数据整理:单位不一致、数量缺失怎么处理?

PDF 采购单数据整理:单位不一致、数量缺失怎么处理?

原创
作者头像
Youna
修改于 2026-11-05 19:31:06
修改于 2026-11-05 19:31:06
60
举报
文章被收录于专栏:ComPDFKit tutorialsComPDFKit tutorials

把供应商发来的采购单 PDF 整理成表格时,同一种物料可能写“12 件”,也可能写“2 箱”。如果汇总表按“件”统计,只提取数字就会丢掉数量的含义。

整理时应一起保留数量、单位和换算依据。“2 箱”需要先确认每箱件数,再换算成件;数量未填写时,应标记为缺失,不能用 0 补齐。处理好这些差异,汇总表里的数字才有相同的统计口径。

下面以按整数件数管理的物料为例,说明从原文核对、字段整理到单位换算的处理方法,并提供 Python 数量检查示例。读者可以用自己的获准文件,检查单位不一致、零值和缺失信息分别会得到什么结果。

先保留原文,再整理字段

PDF 解析解决的是从文档中取得内容和结构。它提供的数字,需要结合原文里的单位和业务含义判断。

可以先准备三类输入,分别查看解析结果:

原文内容

需要保留的信息

后续动作

支架 12 件

数量 12、单位“件”、原文位置

按件数检查

支架 2 箱,每箱件数未填写

数量 2、单位“箱”、换算关系缺失

待确认

赠品 0 件

数量 0、单位“件”

保留零值,再按业务规则确认

以文档解析接口为例,ComPDF 智能全文解析接口参考说明了请求与返回结构。应用需要从实际返回结果中整理业务字段。先检查结果是否保留了数量、单位及其对应关系;不要看到一个数字就脱离上下文填入业务表。

建议将源 PDF、解析结果和整理后的业务字段分开保存。业务记录至少保留来源文件、页码或原文片段,人工修改时能找回依据。字段名、表格位置与返回结构应按实际输出适配,不能假定所有文档都返回同一套业务字段。

换算规则放在应用层

下面的 Python 示例只处理“件”和“箱”,要求数量为非负整数、每箱件数为正整数。它适用于本例的整件物料;称重物料、允许半箱的业务应另定规则。

代码语言: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 件”和“数量未填写”含义不同。前者可能是明确记录,后者是缺失;如果业务不接受零数量,应在下一层规则中拒绝,不能先用默认值把两者合并。

用自己的文件做一轮检查

先拿一份正常文件和一份异常文件,小范围完成下面四步:

  1. 对照 PDF 原文检查料号、数量、单位和表格行的对应关系,确认没有串行或漏行。
  2. 将整理后的字段交给数量规则;主动删除换算关系、改成未知单位,查看是否进入待确认。
  3. 完成人工确认后重跑规则,检查来源和修改记录是否仍在;新解析结果不要覆盖已经确认过的值。
  4. 在测试环境重复提交同一文件,检查是否重复创建候选记录。可在租户范围内结合文件内容哈希、处理规则版本和数据库唯一约束去重;同一订单的修订版本仍需单独管理。

最后再核对业务编号、权限、重复提交和导入接口约束。解析服务负责取得文档内容,应用负责决定字段能否进入业务系统。把这两层分开,才能知道错误发生在识别、字段整理还是业务判断,也便于处理人员有依据地修正。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 先保留原文,再整理字段
  • 换算规则放在应用层
  • 人工确认要解决具体问题
  • 用自己的文件做一轮检查
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档