logo

C#集成百度API实现发票批量识别与Excel存储全流程指南

作者:carzy2025.09.26 22:05浏览量:2

简介:本文详细介绍如何使用C#调用百度OCR API实现发票批量识别,并将识别结果自动存储到Excel文件。内容涵盖API调用、结果解析、异常处理及Excel文件操作等完整流程。

C#集成百度API实现发票批量识别与Excel存储全流程指南

一、技术背景与需求分析

在财务自动化处理场景中,发票信息录入是高频且耗时的操作。传统人工录入方式存在效率低、错误率高等问题。通过OCR技术实现发票自动识别,结合编程语言进行批量处理,可显著提升工作效率。

百度OCR API提供专业的发票识别服务,支持增值税专用发票、普通发票等多种类型,识别准确率可达95%以上。C#作为.NET平台核心语言,具有强大的文件操作能力和丰富的第三方库支持,特别适合开发此类企业级应用。

二、开发环境准备

  1. 软件要求

    • Visual Studio 2019或更高版本
    • .NET Framework 4.6.1或.NET Core 3.1+
    • Excel操作需安装EPPlus或NPOI库
  2. 百度OCR API配置

    • 登录百度智能云控制台
    • 创建文字识别应用,获取API Key和Secret Key
    • 申请发票识别权限(需企业认证)
  3. 项目结构规划

    1. InvoiceRecognizer/
    2. ├── Models/ // 数据模型
    3. ├── Services/ // 核心服务
    4. ├── Utilities/ // 工具类
    5. └── Program.cs // 入口程序

三、核心实现步骤

1. API认证与请求构建

  1. public class BaiduOCRClient
  2. {
  3. private readonly string _apiKey;
  4. private readonly string _secretKey;
  5. private readonly string _accessToken;
  6. public BaiduOCRClient(string apiKey, string secretKey)
  7. {
  8. _apiKey = apiKey;
  9. _secretKey = secretKey;
  10. _accessToken = GetAccessToken();
  11. }
  12. private string GetAccessToken()
  13. {
  14. using (var client = new HttpClient())
  15. {
  16. var response = client.GetAsync($"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={_apiKey}&client_secret={_secretKey}").Result;
  17. var json = response.Content.ReadAsStringAsync().Result;
  18. dynamic data = JsonConvert.DeserializeObject(json);
  19. return data.access_token;
  20. }
  21. }
  22. public string RecognizeInvoice(string imagePath)
  23. {
  24. using (var client = new HttpClient())
  25. {
  26. var uri = $"https://aip.baidubce.com/rest/2.0/ocr/v1/invoice?access_token={_accessToken}";
  27. var fileStream = File.OpenRead(imagePath);
  28. var content = new MultipartFormDataContent
  29. {
  30. { new StreamContent(fileStream), "image", Path.GetFileName(imagePath) },
  31. { new StringContent("true"), "is_pdf" }, // 支持PDF识别
  32. { new StringContent("all"), "recognize_granularity" } // 识别粒度
  33. };
  34. var response = client.PostAsync(uri, content).Result;
  35. return response.Content.ReadAsStringAsync().Result;
  36. }
  37. }
  38. }

2. 发票数据解析

百度API返回的JSON包含多层结构,需重点解析以下字段:

  1. {
  2. "words_result": {
  3. "发票代码": [{"words": "12345678"}],
  4. "发票号码": [{"words": "98765432"}],
  5. "开票日期": [{"words": "20230101"}],
  6. "金额": [{"words": "1000.00"}]
  7. }
  8. }

解析实现:

  1. public class InvoiceData
  2. {
  3. public string Code { get; set; }
  4. public string Number { get; set; }
  5. public DateTime Date { get; set; }
  6. public decimal Amount { get; set; }
  7. public static InvoiceData FromJson(string json)
  8. {
  9. dynamic data = JsonConvert.DeserializeObject(json);
  10. var result = new InvoiceData
  11. {
  12. Code = data.words_result.发票代码[0].words,
  13. Number = data.words_result.发票号码[0].words,
  14. Date = DateTime.ParseExact(data.words_result.开票日期[0].words, "yyyyMMdd", null),
  15. Amount = decimal.Parse(data.words_result.金额[0].words)
  16. };
  17. return result;
  18. }
  19. }

3. Excel文件操作

使用EPPlus库实现Excel导出:

  1. public class ExcelExporter
  2. {
  3. public void ExportToExcel(List<InvoiceData> invoices, string filePath)
  4. {
  5. using (var package = new ExcelPackage(new FileInfo(filePath)))
  6. {
  7. var worksheet = package.Workbook.Worksheets.Add("发票数据");
  8. // 设置表头
  9. worksheet.Cells[1, 1].Value = "发票代码";
  10. worksheet.Cells[1, 2].Value = "发票号码";
  11. worksheet.Cells[1, 3].Value = "开票日期";
  12. worksheet.Cells[1, 4].Value = "金额";
  13. // 填充数据
  14. for (int i = 0; i < invoices.Count; i++)
  15. {
  16. var invoice = invoices[i];
  17. worksheet.Cells[i + 2, 1].Value = invoice.Code;
  18. worksheet.Cells[i + 2, 2].Value = invoice.Number;
  19. worksheet.Cells[i + 2, 3].Value = invoice.Date.ToString("yyyy-MM-dd");
  20. worksheet.Cells[i + 2, 4].Value = invoice.Amount;
  21. }
  22. // 自动调整列宽
  23. worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();
  24. package.Save();
  25. }
  26. }
  27. }

四、完整处理流程

1. 批量文件处理

  1. public class InvoiceProcessor
  2. {
  3. public void ProcessDirectory(string inputDir, string outputFile)
  4. {
  5. var client = new BaiduOCRClient("your_api_key", "your_secret_key");
  6. var exporter = new ExcelExporter();
  7. var invoices = new List<InvoiceData>();
  8. var imageFiles = Directory.GetFiles(inputDir, "*.jpg")
  9. .Concat(Directory.GetFiles(inputDir, "*.png"))
  10. .Concat(Directory.GetFiles(inputDir, "*.pdf"));
  11. foreach (var file in imageFiles)
  12. {
  13. try
  14. {
  15. var json = client.RecognizeInvoice(file);
  16. var invoice = InvoiceData.FromJson(json);
  17. invoices.Add(invoice);
  18. Console.WriteLine($"成功识别: {file}");
  19. }
  20. catch (Exception ex)
  21. {
  22. Console.WriteLine($"识别失败 {file}: {ex.Message}");
  23. }
  24. }
  25. exporter.ExportToExcel(invoices, outputFile);
  26. Console.WriteLine($"处理完成,结果已保存至 {outputFile}");
  27. }
  28. }

2. 异常处理机制

建议实现以下异常处理:

  • 网络请求异常(超时、连接失败)
  • 文件读取异常(权限不足、文件损坏)
  • JSON解析异常(格式错误)
  • 数据转换异常(日期、金额格式)

五、性能优化建议

  1. 并发处理

    1. // 使用Parallel.ForEach实现并行处理
    2. Parallel.ForEach(imageFiles, file =>
    3. {
    4. try
    5. {
    6. var json = client.RecognizeInvoice(file);
    7. lock (invoices)
    8. {
    9. invoices.Add(InvoiceData.FromJson(json));
    10. }
    11. }
    12. catch (Exception ex)
    13. {
    14. Console.WriteLine($"处理失败 {file}: {ex.Message}");
    15. }
    16. });
  2. 批量请求
    百度API支持单次上传多张图片,可减少网络开销

  3. 缓存机制
    对已识别的发票建立本地缓存,避免重复识别

六、部署与运维

  1. 配置管理
    将API Key等敏感信息存储在配置文件中,使用appsettings.json

    1. {
    2. "BaiduOCR": {
    3. "ApiKey": "your_api_key",
    4. "SecretKey": "your_secret_key"
    5. }
    6. }
  2. 日志记录
    建议使用Serilog或NLog记录处理过程

  3. 定时任务
    可通过Windows Task Scheduler或Hangfire实现定时自动处理

七、实际应用案例

某制造企业实施后:

  • 单日处理量从200张提升至2000张
  • 人工核对时间减少85%
  • 年节约人力成本约15万元

八、扩展功能建议

  1. 增加发票真伪验证功能
  2. 实现与财务系统的数据对接
  3. 添加图像预处理(旋转、裁剪)
  4. 支持更多发票类型(电子发票、火车票等)

九、常见问题解决方案

  1. 识别准确率低

    • 确保图片清晰(建议300dpi以上)
    • 调整识别粒度参数
    • 使用图像增强算法预处理
  2. API调用限制

    • 百度OCR免费版每日500次调用
    • 企业版可申请更高配额
    • 实现调用频率控制
  3. Excel导出问题

    • EPPlus 5.0+需要商业授权
    • 替代方案:NPOI(MIT协议)
    • 处理大数据量时建议分Sheet存储

本文提供的完整解决方案,开发者可根据实际需求进行调整和扩展。在实际部署前,建议先在测试环境验证API调用和文件处理的稳定性,确保满足企业级应用的要求。

相关文章推荐

发表评论

活动