01 场景说明
在费用报销业务中,财务人员每天需要处理大量不同类型的报销单据,例如:- 报销申请单(XLS 格式):记录申请人、出差目的、费用明细等信息
- 酒店水单(图片):记录入住日期、离店日期及消费明细
- 支付记录(PDF):记录交易流水号、交易金额、收付款方信息
02 业务流程

工作空间、文件类别和审核规则库只需配置一次,后续可持续复用——直接上传新的待处理文件并创建新的审核任务即可。本示例为演示完整流程,将配置步骤和处理步骤放在同一段代码中运行。
03 先决条件
- 登录 TextIn 控制台,获取
x-ti-app-id和x-ti-secret-code - 在控制台「企业管理」中查看企业组织 ID(
enterprise_id),参考 如何获取企业 ID - 下载示例样本文件,或使用自己的报销单据
04 类别与字段配置
本示例配置三个文件类别,字段设计如下:酒店水单(样本:sample_hotel_receipt.png)
酒店水单(样本:sample_hotel_receipt.png)
酒店水单是住宿消费的凭证,通常包含入住/离店日期等全局信息,以及按天计费的消费明细表格。字段配置同时使用基本信息字段(全局信息)和表格字段(逐行消费记录),以完整提取单据中的结构化数据:

| 字段名 | 类型 |
|---|---|
| 入住日期 | 基本信息字段 |
| 离店日期 | 基本信息字段 |
| 总金额 | 基本信息字段 |
| 日期 | 表格字段 |
| 费用类型 | 表格字段 |
| 金额 | 表格字段 |
| 备注 | 表格字段 |
支付记录(样本:sample_payment_record.pdf)
支付记录(样本:sample_payment_record.pdf)
支付记录是银行或支付机构出具的电子回单,包含交易流水号、交易双方及金额等详情。通过字段抽取,可快速核验报销金额和收付款方是否与申请单一致:

| 字段名 | 类型 |
|---|---|
| 交易流水号 | 基本信息字段 |
| 交易授权码 | 基本信息字段 |
| 付款卡种 | 基本信息字段 |
| 收款方户名 | 基本信息字段 |
| 付款方户名 | 基本信息字段 |
| 交易时间 | 基本信息字段 |
| 备注 | 基本信息字段 |
| 收款方账户 | 基本信息字段 |
| 收款方银行 | 基本信息字段 |
| 交易金额 | 基本信息字段 |
| 交易描述 | 基本信息字段 |
| 付款银行 | 基本信息字段 |
| 币种 | 基本信息字段 |
| 交易账号/支付方式 | 基本信息字段 |
报销申请单(样本:报销申请单.XLS)
报销申请单(样本:报销申请单.XLS)
报销申请单是差旅费用报销的主单据,以 Excel 表格形式记录申请人信息、出差行程及各项费用明细。通过字段抽取,系统可自动录入申请人、金额、税率等关键数据,避免手工填表出错:
| 字段名 | 类型 |
|---|---|
| 申请人 | 基本信息字段 |
| 出差目的 | 基本信息字段 |
| 报销期间 | 基本信息字段 |
| 目的地 | 基本信息字段 |
| 费用发生日期 | 基本信息字段 |
| 费用项目 | 基本信息字段 |
| 差旅费金额 | 基本信息字段 |
| 税率 | 基本信息字段 |
| 冲借款金额 | 基本信息字段 |
| 申请付款金额 | 基本信息字段 |
| 备注 | 基本信息字段 |
| 税额 | 基本信息字段 |
05 审核规则配置
本示例的审核规则库包含 3 个规则组、8 条审核规则,覆盖单据内合规性检查、差旅政策匹配和跨单据交叉核验三个维度:规则组 1:报销申请单合规性检查(适用分类:报销申请单)
规则组 1:报销申请单合规性检查(适用分类:报销申请单)
| 规则名称 | 风险等级 | 审核逻辑 |
|---|---|---|
| 行报销金额校验 | 🔴 高风险 | 行申请付款金额 ≤ 行差旅费金额(含税)- 行冲借款金额,冲借款金额为空时视为 0 |
| 报销总金额校验 | 🔴 高风险 | 申请付款总金额 ≤ Σ 行申请付款金额 |
| 报销期间与费用日期匹配 | 🟡 中风险 | ”费用发生日期”应在”报销期间”所覆盖的日期范围内 |
| 必填字段完整性校验 | 🔴 高风险 | ”申请人”、“费用发生日期”、“费用项目”、“申请付款金额”均不为空 |
规则组 2:差旅费用政策匹配审核(适用分类:酒店水单)
规则组 2:差旅费用政策匹配审核(适用分类:酒店水单)
| 规则名称 | 风险等级 | 审核逻辑 |
|---|---|---|
| 城市差标匹配 | 🟡 中风险 | 酒店住宿单价 ≤ 目的地城市差旅标准:一线城市(北京/上海/广州/深圳)≤ 800 元/晚,省会及计划单列市 ≤ 500 元/晚,其他城市 ≤ 300 元/晚 |
| 酒店明细合计金额校验 | 🟡 中风险 | 所有明细行”金额”合计 = “总金额” |
规则组 3:跨文档交叉审核(适用分类:报销申请单 + 酒店水单 + 支付记录)
规则组 3:跨文档交叉审核(适用分类:报销申请单 + 酒店水单 + 支付记录)
| 规则名称 | 风险等级 | 审核逻辑 |
|---|---|---|
| 跨文档金额匹配 | 🔴 高风险 | 报销申请单差旅费金额 = 酒店水单总金额 = 支付记录交易金额,允许 ±0.1 元误差 |
| 付款人身份与申请人一致性 | 🟡 中风险 | 支付记录”付款方户名”与报销申请单”申请人”为同一人 |
06 代码结构说明
示例代码将完整的七步流程放在一起运行,便于理解端到端的调用链路。在实际生产中,步骤 1、2、5(创建工作空间、配置文件类别、配置审核规则库)只需执行一次;后续处理新单据时,只需重复步骤 3、4、6、7(上传文件 → 获取抽取结果 → 提交审核任务 → 获取审核结果),直接复用已有的工作空间、类别和规则库即可。 示例代码中的函数分为两类,理解这一点有助于对照 API 文档进行调试和扩展。两类函数
REST API 调用函数 — 每个函数直接封装一个 API 端点,函数参数与接口文档一一对应:| 函数(Python) | 方法(Java) | 对应 API 端点 | 说明 |
|---|---|---|---|
create_workspace | createWorkspace | POST /workspace/create | 创建工作空间,返回 workspace_id |
create_category | createCategory | POST /category/create | 创建文件类别并上传样本文件,返回 category_id |
add_category_field | addCategoryField | POST /category/fields/add | 为已有类别追加字段(用于添加表格字段) |
upload_file | uploadFile | POST /file/upload | 上传待处理文件,返回 batch_number |
create_rule_repo | createRuleRepo | POST /review/rule_repo/create | 创建审核规则库,返回 repo_id |
create_rule_group | createRuleGroup | POST /review/rule_group/create | 在规则库内创建规则组,返回 group_id |
create_rule | createRule | POST /review/rule/create | 在规则组内创建审核规则,绑定适用分类 |
submit_review_task | submitReviewTask | POST /review/task/submit | 提交审核任务,返回审核 task_id |
| 函数(Python) | 方法(Java) | 作用 |
|---|---|---|
_headers | authHeaders | 构造鉴权请求头 |
_check | checkResponse | 校验响应 code,统一异常处理 |
_mime | mimeType | 根据扩展名推断 MIME 类型 |
wait_for_result | waitForResult | 循环轮询 file/fetch,等待抽取完成 |
display_result | displayResult | 格式化打印抽取结果 |
wait_for_review | waitForReview | 循环轮询 review/task/result,等待审核完成 |
display_review_result | displayReviewResult | 格式化打印审核结果 |
逐步代码说明
步骤 1:创建工作空间
步骤 1:创建工作空间
工作空间名称中加入时间戳,确保每次运行都会创建独立的新空间,避免重名错误。
- Python
- Java
步骤 2:配置文件类别
步骤 2:配置文件类别
create_category 通过 multipart 表单一次性完成类别创建、样本上传和字段配置。对于需要表格字段的类别(如酒店水单),在创建后再调用 add_category_field 追加。- Python
- Java
步骤 3:上传待处理文件
步骤 3:上传待处理文件
upload_file 将文件上传至工作空间,系统返回 batch_number,后续通过该 ID 查询处理结果。- Python
- Java
步骤 4:获取抽取结果
步骤 4:获取抽取结果
wait_for_result 封装了轮询逻辑,每隔 3 秒查询一次 file/fetch,直到 recognition_status 变为 1(成功)。返回的文件对象中包含 task_id,后续审核步骤需要用到。- Python
- Java
步骤 5:配置审核规则库
步骤 5:配置审核规则库
规则库采用三层结构:规则库 → 规则组 → 规则。
create_rule 的 category_ids 参数指定规则适用的分类,使用步骤 2 中获得的 category_id。- Python
- Java
步骤 6:提交审核任务
步骤 6:提交审核任务
从步骤 4 的抽取结果中提取
task_id,传入审核接口。审核任务是异步执行的,提交后需要轮询结果。- Python
- Java
步骤 7:获取审核结果
步骤 7:获取审核结果
wait_for_review 轮询 review/task/result 接口,直到任务状态变为终态(1=审核通过、2=审核失败、4=审核不通过、7=识别失败)。- Python
- Java
抽取结果示例

审核结果示例

07 完整示例代码下载
完整可运行代码(含 Python、Java 两个版本)已内置在文档仓库的examples/ 目录下:
Python 示例
查看 Python 完整示例代码
Java 示例
查看 Java 完整示例代码
08 运行示例
- Python
- Java
环境要求:Python 3.8+1. 安装依赖2. 填写配置打开 3. 运行
expense_reimbursement.py,填写文件顶部的配置项:预期控制台输出
成功运行后,控制台将输出如下内容(workspace_id、category_id 等 ID 因运行环境不同而变化):09 结果说明
抽取结果
处理完成后,每份文件将返回分类结果和字段抽取结果。字段抽取结果位于data.fields[],每个字段包含 key、value 及坐标 position(可用于原文高亮回显)。
以下为三份样本文件的实际接口返回(来自 file/fetch,省略了部分 position 坐标):
报销申请单.XLS
报销申请单.XLS
sample_hotel_receipt.png
sample_hotel_receipt.png
sample_payment_record.pdf
sample_payment_record.pdf
审核结果
审核完成后,可从review/task/result 接口获取以下信息:
status:任务整体状态(1=审核通过,4=审核不通过,2=审核失败)statistics:规则通过数、不通过数汇总groups[].review_tasks[]:每条规则的详细审核结果,包含:review_result:该规则的审核结论reasoning:AI 给出的审核依据说明anchors:依据在原文中的坐标位置(可用于高亮回显)

