在财务与税务场景中,发票信息录入是最常见也最耗时的工作之一。每张发票上的发票号、日期、金额、税额、购买方,都需要人工逐张核对后录入 Excel 或财务系统;到了月中对账、月末报税或报销高峰期,积压的发票往往数以百计,录入手速就成了瓶颈。传统做法是逐页打开发票 PDF、找到对应字段、复制粘贴——不仅效率低下,而且极易发生漏项、错位、金额抄错等问题,任何一处偏差都会直接影响对账与报税准确性。发票版式又各不相同,字段位置五花八门,进一步加大了手工整理的出错风险。因此,把"逐张读发票、抄字段"这件重复劳动交给程序自动完成,是财务团队最迫切想解决的痛点之一。
对比传统SDK API处理
同样是"从 PDF 发票提取字段并导出 Excel",传统 SDK 与 Spire.Agent.Office 走的是两条完全不同的路。传统方式要求你先把每张发票的字段位置、页面结构摸清,再为每个字段编写定位与提取代码,换一种版式就得改代码;而智能体方式只需要你用自然语言把"要提取什么、导出成什么"说清楚,剩下的事情由 AI 理解并编排完成:
| 传统 Spire.Office for .NET API | Spire.Agent.Office 处理 | |
|---|---|---|
| 驱动方式 | 编写循环 + 条件判断 + 异常处理代码,控制文档处理的每一步 | 用自然语言描述目标,AI 理解后自动编排执行路径 |
| 代码量 | 逐页解析通常需要 300-600 行 C# 代码(含页面遍历、字段定位、数据导出等) | 约 10 行调用代码 + 1 条自然语言指令 |
| 字段识别 | 需硬编码每个字段的页面位置与格式,版式变化需改代码 | AI 自动理解发票版式并定位发票号、日期、金额等字段 |
| 页面处理 | 需手动遍历每一页并逐个提取 | AI 自动逐页提取并汇总 |
| 数据导出 | 需手动编写 Excel 写入逻辑与列布局 | AI 自动生成结构化 Excel,字段对齐 |
| 需求变更 | 改动提取字段 → 改代码 → 编译 → 重新部署 | 修改指令,即刻生效 |
从对比可以看出,当发票版式、提取字段或导出结构频繁变化时,智能体只需改一句话,传统方案却要改代码、重新编译部署。
本文介绍如何使用 Spire.Agent.Office PDF AI 能力,自动提取 PDF 发票中每页的发票号、日期、金额、税额、购买方信息,并导出为 Excel,让财务票据数字化一步到位。
有关产品安装和 SpireToken 配置,请参考 在 .NET 项目中集成 Spire.Agent.Office。以下示例默认已安装 Spire.Agent.Office 并完成 SpireToken 配置。
发票信息自动提取
发票信息自动提取的核心思路是:把多份发票 PDF 作为附件交给 AI 智能体,智能体读取各张发票后逐页理解版式,识别发票号码、开票日期、金额、税号、税额、购买方名称、抬头等字段,并汇总导出为结构化 Excel。整个处理大致分成三步——首先智能体读取各张发票 PDF 并定位每一页的发票字段,其次把各页识别出的字段按语义对齐(例如把"发票号码""Invoice No.""請求書番号"都归一到同一列),最后将结果汇总写入 Excel,并按要求自动美化(调整列宽、添加边框、数值保留两位小数并右对齐)。整个"逐页解析 → 字段识别 → 汇总美化"过程由 AI 按自然语言指令自动完成,无需为每张发票单独编写解析逻辑,也无需关心不同供应商发票版式之间的差异。
对于几十上百页的发票 PDF,传统做法需要为每一种版式编写一套定位规则,而智能体方式下,无论发票来源与版式如何变化,你始终只维护一条自然语言指令。字段口径(如金额取含税还是不含税)、列顺序、是否标注异常等需求,也都可以直接写进指令,随改随生效。
以下示例使用 Spire.Agent.Office 智能体,通过自然语言指令自动提取 PDF 中每页发票信息并导出为 Excel:
using Spire.Agent.Office.AI;
using Spire.Agent.Office.Extensions;
using Spire.Pdf;
// PDF 处理相关配置
string key = "**************************"; // 需要在官网页面申请 SpireToken Key
string inputDir = @"E:\invoices"; // 发票PDF目录,可放多个PDF
string[] pdfFiles = Directory.GetFiles(inputDir, "*.pdf", SearchOption.TopDirectoryOnly);
string savePath = @"E:\output\合并.xlsx"; // 结果文档路径(null 时自动生成到输出目录)
string instruction =
"读取附件文件并识别每张发票的信息,提取发票号码、开票日期、金额、税号、税额、购买方名称、抬头\n" +
"每张发票作为一行,汇总到同一个Excel表格中。\n" +
"导出为Excel时请对表格进行适当美化\n" +
"根据各列内容自动调整列宽,确保文字完整显示;为整个数据区域添加边框,使行列清晰易读;\n" +
"金额、税额等数值列保留两位小数并右对齐。最终保存为格式规范、便于阅读的Excel文件。";
// 调用PDF文档处理函数(附件为各张发票PDF)
AIResult result = ExecuteDemoPDF(instruction, savePath, key, pdfFiles);
// 执行PDF文档AI处理
static AIResult ExecuteDemoPDF(string instruction, string savePath, string key, string[] attachments)
{
// 创建AIOptions选项配置对象
AIOptions options = new AIOptions();
options.SpireToken = key; // 设置SpireToken Key
// 使用PdfDocument对象处理PDF文档
using (PdfDocument pdf = new PdfDocument())
{
// 创建AI文档处理器,附件即各张发票PDF
AIDocumentProcessor processor = pdf.AI(options);
return processor.ExecuteInstruction(pdf, instruction, savePath, attachments);
}
}
原发票PDF
提取并导出的Excel

常见问题
提取到的金额或税额不正确
原因:发票金额存在大小写两种写法,或含税/不含税口径不一致。
解决:在指令中明确提取口径(如"提取价税合计金额""提取不含税金额"),AI 智能体会按指定口径提取。若发票存在大小写两种金额,建议同时说明以哪一种为准,避免歧义。
不同版式的发票如何识别
原因:不同供应商的发票版式、字段位置各不相同。
解决:AI 智能体可自动理解发票版式并定位字段;如遇特殊版式,可在指令中补充字段说明(例如"发票号码位于右上角"),帮助智能体更准确地定位。
提取结果列顺序/字段名与预期不符
原因:AI 默认按识别顺序输出字段。
解决:在指令中明确字段名与顺序(如"按 发票号、日期、金额、税额、购买方 的顺序导出"),智能体会按你的要求排列输出列。
获取SpireToken Key
- 联系 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 或访问 https://www.e-iceblue.com/TemLicense.html 获得试用/商业 API 密钥
在代码中配置:
AIOptions options = new AIOptions();
options.SpireToken = key;







