
发票 OCR API(开发者教程)
发票 OCR API 利用机器学习技术自动提取发票数据,消除手动输入错误,同时准确地从电子文档和扫描文档中捕获供应商详细信息、发票号码和价格。 本教程演示如何使用IronOCR构建发票 OCR 解决方案。
通过利用机器学习和计算机视觉技术,发票 OCR 技术将发票数据转换为可供自动处理的格式。 您将学习如何应对常见的挑战,例如手动数据输入延迟、成本和错误,同时准确地从任何发票格式中提取供应商信息、发票号码和价格。
本文使用了IronOCR ,这是一款领先的面向.NET开发人员的发票 OCR API。
如何创建发票 OCR API
- 下载并安装发票 OCR API
- 在Visual Studio中创建一个新的C#项目或打开一个现有项目。
- Load an existing image file using
methodOcrInput - 使用
Ocr.Read方法从图像中提取文本。 - Print the extracted text in Console using
Console.WriteLine
什么是 IronOCR?
IronOCR由Iron Software开发,为开发人员提供全面的 OCR 工具。 它利用机器学习和计算机视觉从扫描的文档、图像和PDF中提取文本,实现自动化处理。 其 API 可与各种语言和平台无缝集成,减少人工数据输入错误,提高效率。 提取的数据直接流入现有系统进行分析和决策。 图像预处理、条形码识别和灵活的文件解析等功能增强了其多功能性。 IronOCR使开发人员能够将强大的文本识别功能集成到他们的应用程序中。
该库通过专门的语言包支持125 种国际语言,使其成为全球发票处理的理想选择。 高级功能包括计算机视觉技术,可自动查找文本,这对于布局各异的发票尤其有用。 此外, IronOCR还提供多线程处理功能,可高效处理大量发票处理。
为什么我应该使用IronOCR进行发票处理?
IronOCR为发票处理应用提供了显著优势。 首先,它通过其优化的Tesseract 5 引擎提供卓越的精度,该引擎专门针对.NET应用程序进行了增强。 图书馆可以处理各种发票格式,从扫描文档到PDF 文件,甚至低质量扫描件。
内置图像优化滤镜可在处理前自动增强图像质量,从而实现更准确的文本提取。 对于有特殊要求的发票, IronOCR支持自定义语言训练,可以针对发票类型中常见的独特字体或格式进行优化。
IronOCR与其他 OCR 库有何不同?
IronOCR 的独特之处在于其简单的单行 OCR 功能,同时又具备企业级功能。 与原始的 Tesseract 实现不同, IronOCR提供了一个托管的.NET API,可以无缝地处理复杂的操作。 该库为各种文档类型提供专门的文档读取方法,包括专门支持读取文档中的表格,这对于发票明细项目至关重要。
筛选向导会自动确定特定发票图像的最佳预处理设置,从而消除优化过程中的猜测。 IronOCR还提供全面的调试功能,使开发人员能够可视化 OCR 引擎所看到的内容,并有效地排除提取问题。
我需要哪些先决条件?
在使用IronOCR之前,请确保满足以下先决条件:
- 已安装诸如 Visual Studio 之类的集成开发环境 (IDE),并具备合适的开发环境。
- 具备C#编程基础知识,能够有效地理解和修改代码示例。
- 通过NuGet包管理器或命令行将IronOCR库安装到您的项目中
满足这些先决条件后,您就可以成功地开始使用IronOCR了。
IronOCR提供适用于Windows 、 Linux和macOS的全面设置指南。 该库支持云部署,并针对AWS Lambda和Azure Functions提供了专门的教程。
我应该使用哪个版本的 Visual Studio?
IronOCR支持 Visual Studio 2017 及最新版本。 为了获得最佳兼容性并能使用最新的 C# 功能,建议使用 Visual Studio 2019 或 2022。 该库与.NET Framework、 .NET Core和.NET 5+完全兼容,确保您的开发环境具有灵活性。
对于跨平台开发,带有 C# 扩展的 Visual Studio Code 效果很好。 移动开发人员可以利用 IronOCR 针对Android和iOS实现的指导,使其适用于.NET MAUI应用程序。
我需要什么水平的C#知识?
具备中级 C# 知识即可实现基本的发票 OCR 功能。 你应该能够适应:
- 面向对象编程概念
- 处理流和文件 I/O
- 基本的async/await 模式
- 用于模式匹配的正则表达式
- 异常处理,实现强大的错误管理
IronOCR 直观的 API 设计意味着无需具备图像处理或机器学习方面的深厚专业知识。 该库在内部处理复杂的操作,让您可以专注于业务逻辑。 初学者可以从简单的OCR示例入手。
如何创建一个新的 Visual Studio 项目?
要开始使用IronOCR,首先创建一个新的 Visual Studio 项目。
打开 Visual Studio,转到"文件",将鼠标悬停在"新建"上,然后单击"项目"。
新项目
在新窗口中,选择"控制台应用程序",然后单击"下一步"。
控制台应用程序
出现新窗口。 请输入项目名称和地点,然后单击"下一步"。
项目配置
最后,选择目标框架并单击"创建"。
目标框架
你的新 Visual Studio 项目已准备就绪。 让我们安装IronOCR。
哪种项目类型最适合 OCR 应用?
虽然本教程为了简单起见使用了控制台应用程序,但IronOCR支持多种项目类型:
-控制台应用程序:非常适合批量处理或命令行工具
- Web 应用程序:非常适合构建 API 或基于 Web 的服务
- Windows Forms/WPF :适用于带有图形用户界面的桌面应用程序
- .NET MAUI应用:用于跨平台解决方案
对于大批量处理,可以考虑在 Windows 服务或微服务架构中实现IronOCR 。 图书馆的进度跟踪功能使监控长时间运行的操作变得容易。
我应该选择哪个.NET Framework版本?
IronOCR与.NET版本具有广泛的兼容性。 对于新项目,建议使用.NET 6.0 或更高版本以获得最佳性能和最新功能。 该库保持了出色的向后兼容性:
- .NET Framework 4.6.2+ :适用于传统Enterprise应用程序
- .NET Core 3.1 :长期支持,实现稳定部署
- .NET 5.0+ :性能提升的现代化框架
- .NET Standard 2.0 :跨平台最大程度的兼容性
部署到Docker 容器时, .NET 6.0 或更高版本可提供更小的镜像大小和更好的性能。 Azure Functions同时支持.NET 6.0 和.NET Framework 。
如何安装IronOCR?
下载和安装IronOCR有两种简单的方法:
- 使用 Visual Studio NuGet包管理器
- 使用 Visual Studio 命令行
何时应该使用NuGet包管理器,何时应该使用命令行?
根据您的工作流程,选择使用NuGet包管理器图形用户界面 (GUI) 还是命令行:
NuGet包管理器 GUI在以下情况下效果最佳: 您是NuGet包的新手 您想浏览IronOCR语言包 您更喜欢视觉确认 您管理多个包裹
**命令行(软件包管理器控制台)**在以下情况下表现出色: 您熟悉命令行界面
- 您遵循脚本化部署 您需要快速获取特定版本。
- 您使用了高级安装选项
两种方法都能达到相同的效果——根据舒适度和需求选择即可。
我可能还需要哪些额外的语言包?
IronOCR通过专用软件包支持125 种国际语言。 发票处理时,请考虑以下事项:
-特定业务包:财务文档的财务语言包 -区域语言:根据发票来源而定(西班牙语、法语、德语) -多语言支持:适用于包含多种语言的发票 -自定义语言:用于特殊字体或自定义训练数据
语言包与IronOCR主程序包一起安装,可显著提高非英语文本的识别准确率。
使用 Visual Studio NuGet 软件包管理器
using Visual Studio NuGet包管理器将IronOCR集成到您的 C# 项目中。
导航至**"工具"** > "NuGet程序包管理器" > "管理解决方案的NuGet程序包"。
NuGet 软件包管理器
搜索IronOCR并将其安装到您的项目中。
在NuGet包管理器UI中选择IronOCR包
使用相同的方法安装其他语言包。
使用Visual Studio命令行
1.在 Visual Studio 中,转到 工具> > NuGet软件包管理器> > 软件包管理器控制台 2. 在软件包管理器控制台中输入以下命令:
包管理器控制台
该软件包将下载并安装到您当前的项目中,即可使用。
如何使用IronOCR从发票中提取数据?
使用IronOCR ,只需几行代码即可轻松提取发票数据。 它取代了手动数据录入,简化了您的工作流程。
以下是一个用于文本提取的发票示例:
示例发票
让我们从这张发票中提取所有数据:
using IronOcr;
使用系统;
// Initialize a new instance of the IronTesseract class
// This is the main OCR engine that will process our invoice
var ocr = new IronTesseract();
// Configure OCR settings for better invoice processing
ocr.Configuration.BlackListCharacters = "~`$#^*_}{]___PROTECTED_LINK_48___ method from ___PROTECTED_LINK_49___ class. Key enhancements include:
- **Image preprocessing**: ___PROTECTED_LINK_50___ corrects tilted scans; ___PROTECTED_LINK_51___ removes artifacts
- **Resolution enhancement**: Setting ___PROTECTED_LINK_52___ improves recognition
- **Character blacklisting**: Prevents common OCR misinterpretations
- **Confidence scoring**: Assesses extraction reliability
!___PROTECTED_LINK_53___
**Invoice Parser**
### How Do I Handle Different Invoice Formats?
Invoice formats vary between vendors, but IronOCR provides flexible solutions:
1. **Template-based**: Define ___PROTECTED_LINK_54___
2. **Computer vision**: Use ___PROTECTED_LINK_55___ to locate text
3. **Table extraction**: Leverage ___PROTECTED_LINK_56___ for line items
4. **Multi-format**: Process ___PROTECTED_LINK_57___, ___PROTECTED_LINK_58___, and ___PROTECTED_LINK_59___
For complex layouts, implement the ___PROTECTED_LINK_60___ which uses machine learning to identify structures automatically.
### What Are Common Extraction Patterns for Invoice Data?
Invoice data follows recognizable patterns extractable using regular expressions with OCR results:
```C#
using IronOCR;
使用系统;
using System.Text.`RegularExpressions`;
using System.Collections.Generic;
public class `InvoiceDataExtractor`
{
private readonly `IronTesseract` ocr;
public `InvoiceDataExtractor`()
{
ocr = new `IronTesseract`();
// Configure for optimal invoice reading
`ocr.Configuration`.`ReadBarcodes` = true; // Many invoices include barcodes
`ocr.Configuration`.`TesseractVersion` = `TesseractVersion`.Tesseract5;
}
public `InvoiceData` `ExtractInvoiceData`(string imagePath)
{
var invoiceData = new `InvoiceData`();
using (var input = new `OcrInput`(imagePath/))
{
// Apply filters for better accuracy
input.`EnhanceResolution`(300/);
`input.Sharpen`();
var result = `ocr.Read`(input/);
var text = `result.Text`;
// Extract invoice number
invoiceData.`InvoiceNumber` = `ExtractPattern`(text,
@"INV[/-]?\d{4}[/-]?\d{5}|Invoice\s*#?\s*:?\s*(\d+)");
// Extract dates
invoiceData.`InvoiceDate` = `ExtractDate`(text,
@"Invoice\s*Date\s*:?\s*(\d{1,2}[/-]\d{1,2}[/-]\d{2,4})");
invoiceData.`DueDate` = `ExtractDate`(text,
@"Due\s*Date\s*:?\s*(\d{1,2}[/-]\d{1,2}[/-]\d{2,4})");
// Extract amounts
`invoiceData.Total` = `ExtractAmount`(text,
@"Total\s*:?\s*\$?\s*([\d,]+\.?\d*)");
`invoiceData.Tax` = `ExtractAmount`(text,
@"Tax\s*:?\s*\$?\s*([\d,]+\.?\d*)");
// Extract vendor information
invoiceData.`VendorName` = `ExtractVendorName`(text/);
// Extract line items using table detection
invoiceData.`LineItems` = `ExtractLineItems`(result/);
// Extract any barcodes found
if (`result.Barcodes`.Length > 0)
{
invoiceData.`BarcodeValues` = new List<string>();
foreach (var barcode in `result.Barcodes`)
{
invoiceData.`BarcodeValues`.Add(`barcode.Value`);
}
}
}
return invoiceData;
}
private string `ExtractPattern`(string text, string pattern)
{
var match = Regex.Match(text, pattern, `RegexOptions`.`IgnoreCase`);
return `match.Success` ? `match.Value` : `string.Empty`;
}
private `DateTime`? `ExtractDate`(string text, string pattern)
{
var match = Regex.Match(text, pattern, `RegexOptions`.`IgnoreCase`);
if (`match.Success` && `match.Groups`.Count > 1)
{
if (`DateTime`.`TryParse`(`match.Groups`[1].Value, out `DateTime` date))
return date;
}
return null;
}
private decimal `ExtractAmount`(string text, string pattern)
{
var match = Regex.Match(text, pattern, `RegexOptions`.`IgnoreCase`);
if (`match.Success` && `match.Groups`.Count > 1)
{
var amountStr = `match.Groups`[1].Value.Replace(",", "");
if (decimal.`TryParse`(amountStr, out decimal amount))
return amount;
}
return 0;
}
private string `ExtractVendorName`(string text)
{
// Usually the vendor name appears in the first few lines
var lines = `text.Split`('\n'/);
if (`lines.Length` > 0)
{
// Simple heuristic: first non-empty line that's not a common header
foreach (var line in lines)
{
var trimmed = `line.Trim`();
if (!string.`IsNullOrEmpty`(trimmed/) &&
!trimmed.`ToLower`().Contains("invoice") &&
`trimmed.Length` > 3)
{
return trimmed;
}
}
}
return `string.Empty`;
}
private List<`LineItem`> `ExtractLineItems`(`OcrResult` result)
{
var lineItems = new List<`LineItem`>();
// Use IronOCR's table detection capabilities
if (`result.Tables` != null && `result.Tables`.Count > 0)
{
foreach (var table in `result.Tables`)
{
// Process each row as a potential line item
for (int i = 1; i < table.`RowCount`; i++) // Skip header row
{
var item = new `LineItem`
{
Description = table[i, 0]?.Text ?? "",
Quantity = `ParseQuantity`(table[i, 1]?.Text),
`UnitPrice` = `ParseAmount`(table[i, 2]?.Text),
Total = `ParseAmount`(table[i, 3]?.Text)
};
if (!string.`IsNullOrEmpty`(`item.Description`/))
`lineItems.Add`(item/);
}
}
}
return lineItems;
}
private int `ParseQuantity`(string text)
{
if (string.`IsNullOrEmpty`(text/)) return 0;
var cleaned = Regex.Replace(text, @"[^\d]", "");
return int.`TryParse`(cleaned, out int qty) ? qty : 0;
}
private decimal `ParseAmount`(string text)
{
if (string.`IsNullOrEmpty`(text/)) return 0;
var cleaned = Regex.Replace(text, @"[^\d.]", "");
return decimal.`TryParse`(cleaned, out decimal amt) ? amt : 0;
}
}
// Data classes for structured invoice information
public class `InvoiceData`
{
public string `InvoiceNumber` { get; set; }
public `DateTime`? `InvoiceDate` { get; set; }
public `DateTime`? `DueDate` { get; set; }
public string `VendorName` { get; set; }
public decimal Total { get; set; }
public decimal Tax { get; set; }
public List<`LineItem`> `LineItems` { get; set; }
public List<string> `BarcodeValues` { get; set; }
}
public class `LineItem`
{
public string Description { get; set; }
public int Quantity { get; set; }
public decimal `UnitPrice` { get; set; }
public decimal Total { get; set; }
}
发票处理:从发票中提取特定数据
使用以下代码提取特定发票数据,例如客户发票号码:
using IronOCR;
使用系统;
using System.Text.`RegularExpressions`;
// 初始化`IronTesseract`类的新实例
var ocr = new `IronTesseract`();
// 使用`OcrInput`对象加载图像文件
using (var input = new `OcrInput`(@"`r2.png`"/))
{
// 对图像执行OCR
var result = `ocr.Read`(input/);
// 为发票编号定义正则表达式模式
var linePattern = @"INV\/\d{4}\/\d{5}";
// 在提取的文本中匹配该模式
var lineMatch = Regex.Match(`result.Text`, linePattern);
// 检查模式是否与文本的任何部分匹配
if (`lineMatch.Success`)
{
// 如果找到匹配项,则打印发票编号
var lineValue = `lineMatch.Value`;
Console.`WriteLine`("客户发票号码: " + lineValue);
}
}
发票扫描
对于复杂的提取场景,请使用专门的 OCR 配置来优化您的发票类型。OcrResult类提供有关每个已识别元素的详细信息,包括坐标和用于验证的置信度分数。
发票OCR API的主要优势是什么?
IronOCR 的发票 OCR API 通过机器学习和计算机视觉技术改变了发票处理方式。 这项技术将发票文本转换为机器可读格式,简化了数据提取,便于分析、集成和流程改进。 它为发票处理提供强大的自动化功能,提高准确性并优化应付账款等工作流程。
IronOCR利用优化的 Tesseract 结果,无需额外配置即可提供卓越的精度。 它支持 多页框架 TIFF、PDF 文件 和所有流行的图像格式。 从图像中读取条形码增加了另一个提取维度。
发票处理的主要优势:
1.节省时间:将数小时缩短至数秒 2.准确性:通过置信度评分最大限度地减少误差 3.可扩展性:利用多线程处理数千个进程 4.集成:导出为可搜索的 PDF或结构化格式 5.降低成本:降低运营成本
该库部署灵活,可集成到现有系统中——本地部署、云端部署或混合部署。 IronOCR支持Docker 、 Azure和AWS ,可根据您的需求进行扩展。
生产环境可受益于 IronOCR 的许可选项,包括专门的支持和定期更新。 库中的故障排除指南和工程支持可确保顺利实施。
访问主页了解更多关于IronOCR 的信息。 有关发票 OCR 的更多教程,请参阅这份详细的发票 OCR 指南。 要了解如何使用计算机视觉技术识别发票字段,请查看这篇计算机视觉教程。
相关文章


