使用prebuilt-invoice模型调用Form Recognizer API无法获取发票行项目
问题描述
在Form Recognizer Studio中提交发票时,系统可正常识别并展示发票行项目;但使用该平台生成的代码提交同一张发票,返回的JSON数据中缺少行项目,其余发票数据均可正常获取。请问出现该问题的可能原因是什么?
项目配置
<TargetFramework>net6.0</TargetFramework> <PackageReference Include="Azure.AI.FormRecognizer" Version="4.0.0" />
处理发票的代码
public async Task<IActionResult> ProcessInvoice(IFormFile pdfInvoice) { try { string endpoint = "https://xxx.cognitiveservices.azure.com/"; string key = "xxx"; AzureKeyCredential credential = new AzureKeyCredential(key); DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential); using var stream = pdfInvoice.OpenReadStream(); AnalyzeDocumentOperation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", stream); AnalyzeResult result = operation.Value; return Ok(JsonConvert.SerializeObject(result)); } catch (Exception ex) { return BadRequest(ex.Message); } }
可能的原因分析
- SDK版本过低:你使用的Azure.AI.FormRecognizer 4.0.0版本较旧,Form Recognizer服务后续对行项目的识别逻辑有更新,旧SDK可能无法正确解析服务返回的行项目字段。建议升级到最新稳定版(比如4.1.x或更高),新版本会同步服务端的字段映射和解析逻辑。
- 序列化遗漏字段:用JsonConvert.SerializeObject直接序列化AnalyzeResult时,可能因为部分行项目相关属性的嵌套结构、访问修饰符问题,被Json.NET忽略。可以尝试手动提取
result.Documents[0].Tables(发票行项目通常被识别为表格结构)的数据后再序列化,而非直接序列化整个AnalyzeResult对象。 - 请求参数不一致:Form Recognizer Studio提交请求时可能默认启用了额外参数(比如开启文本细节返回、指定识别模式),但你生成的代码里没包含这些参数。可以对比Studio的请求和代码请求的参数,确保一致性,比如是否添加了
includeTextDetails = true这类影响返回数据完整性的参数。 - 流处理位置错误:读取IFormFile流时,若流的位置不在起始处,可能导致发票部分内容未被正确发送到服务端。可以在打开流后添加
stream.Position = 0;重置流位置,再调用识别接口。
内容的提问来源于stack exchange,提问作者Garland Duvall
相关产品推荐
相关产品推荐

