영수증 스캔 API: C# 및 IronOCR 을 사용하여 영수증에서 데이터 추출
영수증 스캔 API는 OCR 기술을 사용하여 영수증에서 데이터 추출을 자동화함으로써 수작업 입력 오류를 크게 줄이고 처리 속도를 높여 줍니다. 본 가이드는 C#에서 IronOCR를 사용하여 이미지 전처리 및 다양한 형식 지원을 통해 영수증 이미지에서 공급자 이름, 날짜, 항목, 가격 및 합계를 정확하게 추출하는 방법을 보여줍니다.
영수증 스캔에 IronOCR을 선택하는 이유는 무엇입니까?
IronOCR은 스캔된 문서, 이미지 및 PDF에서 신뢰할 수 있는 텍스트 추출을 제공하는 유연한 OCR 라이브러리입니다. 고급 알고리즘, 컴퓨터 비전 및 기계 학습 모델을 통해, IronOCR은 까다로운 시나리오에서도 높은 정확성을 보장합니다. 이 라이브러리는 다양한 언어와 글꼴 스타일을 지원하므로, 글로벌 응용 프로그램에 적합합니다. IronOCR를 귀사의 응용 프로그램에 통합함으로써, 데이터 입력 및 텍스트 분석을 자동화하여 생산성을 높일 수 있습니다.
IronOCR은 영수증 이미지에서 어떻게 텍스트를 추출합니까?
IronOCR은 문서, 사진, 스크린샷 및 라이브 카메라 피드에서 텍스트를 JSON 응답으로 가져옵니다. 정교한 알고리즘과 기계 학습을 사용하여, IronOCR은 이미지 데이터를 분석하고 문자 인식을 수행하여 기계가 읽을 수 있는 텍스트로 변환합니다. 도서관은 Tesseract 5 기술을 사용하여, 고유의 개선으로 정확도를 향상시킵니다.
IronOCR는 영수증 처리에 왜 탁월할까요?
IronOCR는 저품질 스캔, 다양한 영수증 포맷 및 다른 방향의 처리에서 우수한 성능을 발휘합니다. 내장된 이미지 전처리 필터는 처리 전에 자동으로 이미지 품질을 향상시켜, 구김이 있거나 바랜 영수증에서도 최적의 결과를 보장합니다.
IronOCR를 사용하기 위해 무엇이 필요한가요?
IronOCR 작업을 시작하기 전에 이러한 전제조건이 충족되어 있는지 확인하세요:
지원되는 개발 환경은 무엇인가요?
필요한 프로그래밍 기술은 무엇인가요?
필요한 소프트웨어 종속성은 무엇인가요?
- IronOCR 설치: NuGet Package Manager를 통해 설치하세요. 플랫폼 별 종속성이 요구될 수 있습니다.
라이선스 키가 필요한가요?
- 라이선스 키 (선택 사항): 무료 체험판 사용 가능; 프로덕션 사용에는 라이선스가 필요합니다.
영수증 스캐닝을 위한 새로운 Visual Studio 프로젝트는 어떻게 만드나요?
Visual Studio에서 새 프로젝트를 어떻게 시작하나요?
Visual Studio를 열고 파일로 이동한 다음 새로 만들기 위에 커서를 올리고 프로젝트를 클릭합니다.
새 프로젝트 이미지
어떤 프로젝트 템플릿을 선택해야 하나요?
콘솔 애플리케이션을 선택하고 다음을 클릭하세요. 이 템플릿은 웹 애플리케이션에 구현하기 전에 IronOCR를 배우기에 이상적입니다.
콘솔 응용 프로그램
영수증 스캐너 프로젝트 이름은 어떻게 정해야 하나요?
프로젝트 이름과 위치를 작성한 후 다음을 클릭하세요. "ReceiptScannerAPI" 같은 설명적인 이름을 선택하세요.
프로젝트 구성
어떤 .NET Framework 버전을 선택해야 하나요?
.NET 5.0 이상을 선택하여 최적의 호환성을 확보한 뒤 생성 버튼을 클릭하세요.
대상 프레임워크
내 프로젝트에 IronOCR를 설치하려면 어떻게 해야 하나요?
두 가지 간단한 설치 방법을 사용할 수 있습니다:
NuGet Package Manager 방법은 어떻게 사용하나요?
도구 > NuGet 패키지 매니저 > 솔루션용 NuGet 패키지 관리로 이동하세요
NuGet 패키지 매니저
IronOCR를 검색하여 패키지를 설치하세요. 비 영어 영수증의 경우, 언어별 패키지를 설치하세요.
IronOCR
명령줄 설치 방법은 어떻게 사용하나요?
- 도구 > NuGet 패키지 매니저 > Package Manager Console로 이동하세요
-
이 명령을 입력하세요:
Install-Package IronOcr
Package Manager Console
IronOCR로 영수증 데이터를 신속하게 추출하려면 어떻게 해야 하나요?
몇 줄의 코드로 영수증 데이터를 추출하세요:
-
NuGet 패키지 관리자를 사용하여 https://www.nuget.org/packages/IronOcr 설치하기
PM > Install-Package IronOcr -
다음 코드 조각을 복사하여 실행하세요.
using IronOcr; using System; var ocr = new IronTesseract(); // Configure for receipt scanning ocr.Configuration.ReadBarCodes = true; ocr.Configuration.WhiteListCharacters = "0123456789.$,ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz% "; using (var input = new OcrInput(@"receipt.jpg")) { // Apply automatic image enhancement input.DeNoise(); input.Deskew(); input.EnhanceResolution(225); // Extract text from receipt var result = ocr.Read(input); // Display extracted text and confidence Console.WriteLine($"Extracted Text:\n{result.Text}"); Console.WriteLine($"\nConfidence: {result.Confidence}%"); } -
실제 운영 환경에서 테스트할 수 있도록 배포하세요.
무료 체험판으로 오늘 프로젝트에서 IronOCR 사용 시작하기
영수증 이미지에서 구조화된 데이터를 어떻게 추출하나요?
IronOCR는 다양한 문서 유형에서 항목별 정보, 가격, 세금 및 총액을 추출합니다. 이 라이브러리는 PDF, 다중 페이지 TIFF, 다양한 이미지 형식을 지원합니다.
using IronOcr;
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
class ReceiptScanner
{
static void Main()
{
var ocr = new IronTesseract();
// Configure OCR for optimal receipt reading
ocr.Configuration.WhiteListCharacters = "0123456789.$,ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz% ";
ocr.Configuration.BlackListCharacters = "~`@#*_}{][|\\";
ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5;
// Load the image of the receipt
using (var input = new OcrInput(@"r2.png"))
{
// Apply image enhancement filters
input.Deskew(); // Fix image rotation
input.EnhanceResolution(225); // Optimal DPI for receipts
input.DeNoise(); // Remove background noise
input.Sharpen(); // Improve text clarity
// Perform OCR on the input image
var result = ocr.Read(input);
// Regular expression patterns to extract relevant details from the OCR result
var descriptionPattern = @"\w+\s+(.*?)\s+(\d+\.\d+)\s+Units\s+(\d+\.\d+)\s+Tax15%\s+\$(\d+\.\d+)";
var pricePattern = @"\$\d+(\.\d{2})?";
var datePattern = @"\d{1,2}[/-]\d{1,2}[/-]\d{2,4}";
// Variables to store extracted data
var descriptions = new List<string>();
var unitPrices = new List<decimal>();
var taxes = new List<decimal>();
var amounts = new List<decimal>();
var lines = result.Text.Split('\n');
foreach (var line in lines)
{
// Match each line against the description pattern
var descriptionMatch = Regex.Match(line, descriptionPattern);
if (descriptionMatch.Success)
{
descriptions.Add(descriptionMatch.Groups[1].Value.Trim());
unitPrices.Add(decimal.Parse(descriptionMatch.Groups[2].Value));
// Calculate tax and total amount for each item
var tax = unitPrices[unitPrices.Count - 1] * 0.15m;
taxes.Add(tax);
amounts.Add(unitPrices[unitPrices.Count - 1] + tax);
}
// Extract date if found
var dateMatch = Regex.Match(line, datePattern);
if (dateMatch.Success)
{
Console.WriteLine($"Receipt Date: {dateMatch.Value}");
}
}
// Output the extracted data
for (int i = 0; i < descriptions.Count; i++)
{
Console.WriteLine($"Description: {descriptions[i]}");
Console.WriteLine($"Quantity: 1.00 Units");
Console.WriteLine($"Unit Price: ${unitPrices[i]:0.00}");
Console.WriteLine($"Taxes: ${taxes[i]:0.00}");
Console.WriteLine($"Amount: ${amounts[i]:0.00}");
Console.WriteLine("-----------------------");
}
// Calculate and display totals
var subtotal = unitPrices.Sum();
var totalTax = taxes.Sum();
var grandTotal = amounts.Sum();
Console.WriteLine($"\nSubtotal: ${subtotal:0.00}");
Console.WriteLine($"Total Tax: ${totalTax:0.00}");
Console.WriteLine($"Grand Total: ${grandTotal:0.00}");
}
}
}
using IronOcr;
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
class ReceiptScanner
{
static void Main()
{
var ocr = new IronTesseract();
// Configure OCR for optimal receipt reading
ocr.Configuration.WhiteListCharacters = "0123456789.$,ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz% ";
ocr.Configuration.BlackListCharacters = "~`@#*_}{][|\\";
ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5;
// Load the image of the receipt
using (var input = new OcrInput(@"r2.png"))
{
// Apply image enhancement filters
input.Deskew(); // Fix image rotation
input.EnhanceResolution(225); // Optimal DPI for receipts
input.DeNoise(); // Remove background noise
input.Sharpen(); // Improve text clarity
// Perform OCR on the input image
var result = ocr.Read(input);
// Regular expression patterns to extract relevant details from the OCR result
var descriptionPattern = @"\w+\s+(.*?)\s+(\d+\.\d+)\s+Units\s+(\d+\.\d+)\s+Tax15%\s+\$(\d+\.\d+)";
var pricePattern = @"\$\d+(\.\d{2})?";
var datePattern = @"\d{1,2}[/-]\d{1,2}[/-]\d{2,4}";
// Variables to store extracted data
var descriptions = new List<string>();
var unitPrices = new List<decimal>();
var taxes = new List<decimal>();
var amounts = new List<decimal>();
var lines = result.Text.Split('\n');
foreach (var line in lines)
{
// Match each line against the description pattern
var descriptionMatch = Regex.Match(line, descriptionPattern);
if (descriptionMatch.Success)
{
descriptions.Add(descriptionMatch.Groups[1].Value.Trim());
unitPrices.Add(decimal.Parse(descriptionMatch.Groups[2].Value));
// Calculate tax and total amount for each item
var tax = unitPrices[unitPrices.Count - 1] * 0.15m;
taxes.Add(tax);
amounts.Add(unitPrices[unitPrices.Count - 1] + tax);
}
// Extract date if found
var dateMatch = Regex.Match(line, datePattern);
if (dateMatch.Success)
{
Console.WriteLine($"Receipt Date: {dateMatch.Value}");
}
}
// Output the extracted data
for (int i = 0; i < descriptions.Count; i++)
{
Console.WriteLine($"Description: {descriptions[i]}");
Console.WriteLine($"Quantity: 1.00 Units");
Console.WriteLine($"Unit Price: ${unitPrices[i]:0.00}");
Console.WriteLine($"Taxes: ${taxes[i]:0.00}");
Console.WriteLine($"Amount: ${amounts[i]:0.00}");
Console.WriteLine("-----------------------");
}
// Calculate and display totals
var subtotal = unitPrices.Sum();
var totalTax = taxes.Sum();
var grandTotal = amounts.Sum();
Console.WriteLine($"\nSubtotal: ${subtotal:0.00}");
Console.WriteLine($"Total Tax: ${totalTax:0.00}");
Console.WriteLine($"Grand Total: ${grandTotal:0.00}");
}
}
}
Imports IronOcr
Imports System
Imports System.Collections.Generic
Imports System.Text.RegularExpressions
Imports System.Linq
Class ReceiptScanner
Shared Sub Main()
Dim ocr = New IronTesseract()
' Configure OCR for optimal receipt reading
ocr.Configuration.WhiteListCharacters = "0123456789.$,ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz% "
ocr.Configuration.BlackListCharacters = "~`@#*_}{][|\"
ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5
' Load the image of the receipt
Using input = New OcrInput("r2.png")
' Apply image enhancement filters
input.Deskew() ' Fix image rotation
input.EnhanceResolution(225) ' Optimal DPI for receipts
input.DeNoise() ' Remove background noise
input.Sharpen() ' Improve text clarity
' Perform OCR on the input image
Dim result = ocr.Read(input)
' Regular expression patterns to extract relevant details from the OCR result
Dim descriptionPattern = "\w+\s+(.*?)\s+(\d+\.\d+)\s+Units\s+(\d+\.\d+)\s+Tax15%\s+\$(\d+\.\d+)"
Dim pricePattern = "\$\d+(\.\d{2})?"
Dim datePattern = "\d{1,2}[/-]\d{1,2}[/-]\d{2,4}"
' Variables to store extracted data
Dim descriptions = New List(Of String)()
Dim unitPrices = New List(Of Decimal)()
Dim taxes = New List(Of Decimal)()
Dim amounts = New List(Of Decimal)()
Dim lines = result.Text.Split(ControlChars.Lf)
For Each line In lines
' Match each line against the description pattern
Dim descriptionMatch = Regex.Match(line, descriptionPattern)
If descriptionMatch.Success Then
descriptions.Add(descriptionMatch.Groups(1).Value.Trim())
unitPrices.Add(Decimal.Parse(descriptionMatch.Groups(2).Value))
' Calculate tax and total amount for each item
Dim tax = unitPrices(unitPrices.Count - 1) * 0.15D
taxes.Add(tax)
amounts.Add(unitPrices(unitPrices.Count - 1) + tax)
End If
' Extract date if found
Dim dateMatch = Regex.Match(line, datePattern)
If dateMatch.Success Then
Console.WriteLine($"Receipt Date: {dateMatch.Value}")
End If
Next
' Output the extracted data
For i As Integer = 0 To descriptions.Count - 1
Console.WriteLine($"Description: {descriptions(i)}")
Console.WriteLine("Quantity: 1.00 Units")
Console.WriteLine($"Unit Price: ${unitPrices(i):0.00}")
Console.WriteLine($"Taxes: ${taxes(i):0.00}")
Console.WriteLine($"Amount: ${amounts(i):0.00}")
Console.WriteLine("-----------------------")
Next
' Calculate and display totals
Dim subtotal = unitPrices.Sum()
Dim totalTax = taxes.Sum()
Dim grandTotal = amounts.Sum()
Console.WriteLine(vbCrLf & $"Subtotal: ${subtotal:0.00}")
Console.WriteLine($"Total Tax: ${totalTax:0.00}")
Console.WriteLine($"Grand Total: ${grandTotal:0.00}")
End Using
End Sub
End Class
영수증 스캔 정확성을 향상시키는 기술은 무엇입니까?
정확한 영수증 스캔을 위한 핵심 기술:
- 문자 화이트리스트: 예상 문자로 인식을 제한
- 이미지 전처리: 디스큐잉, 해상도 향상, 및 노이즈 제거 사용
- 패턴 매칭: 정규 표현식을 사용하여 구조화된 데이터 추출
- 신뢰도 점수: 인식 신뢰도에 기반한 결과 검증
산출
전체 영수증 내용을 추출하려면 어떻게 해야 합니까?
형식을 유지하면서 전체 영수증 내용을 추출:
using IronOcr;
using System;
using System.Linq;
class WholeReceiptExtractor
{
static void Main()
{
var ocr = new IronTesseract();
// Configure for receipt scanning
ocr.Configuration.ReadBarCodes = true; // Enable barcode detection
ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5; // Use latest engine
ocr.Configuration.EngineMode = TesseractEngineMode.TesseractAndLstm; // Best accuracy
using (var input = new OcrInput(@"r3.png"))
{
// Apply automatic image correction
input.WithTitle("Receipt Scan");
// Use computer vision to find text regions
var textRegions = input.FindTextRegions();
Console.WriteLine($"Found {textRegions.Count()} text regions");
// Apply optimal filters for receipt processing
input.ApplyOcrInputFilters();
// Perform OCR on the entire receipt
var result = ocr.Read(input);
// Display extracted text
Console.WriteLine("=== EXTRACTED RECEIPT TEXT ===");
Console.WriteLine(result.Text);
// Get detailed results
Console.WriteLine($"\n=== OCR STATISTICS ===");
Console.WriteLine($"OCR Confidence: {result.Confidence:F2}%");
Console.WriteLine($"Pages Processed: {result.Pages.Length}");
Console.WriteLine($"Paragraphs Found: {result.Paragraphs.Length}");
Console.WriteLine($"Lines Detected: {result.Lines.Length}");
Console.WriteLine($"Words Recognized: {result.Words.Length}");
// Extract any barcodes found
if (result.Barcodes.Any())
{
Console.WriteLine("\n=== BARCODES DETECTED ===");
foreach(var barcode in result.Barcodes)
{
Console.WriteLine($"Type: {barcode.Type}");
Console.WriteLine($"Value: {barcode.Value}");
Console.WriteLine($"Location: X={barcode.X}, Y={barcode.Y}");
}
}
// Save as searchable PDF
result.SaveAsSearchablePdf("receipt_searchable.pdf");
Console.WriteLine("\nSearchable PDF saved as: receipt_searchable.pdf");
// Export as hOCR for preservation
result.SaveAsHocrFile("receipt_hocr.html");
Console.WriteLine("hOCR file saved as: receipt_hocr.html");
}
}
}
using IronOcr;
using System;
using System.Linq;
class WholeReceiptExtractor
{
static void Main()
{
var ocr = new IronTesseract();
// Configure for receipt scanning
ocr.Configuration.ReadBarCodes = true; // Enable barcode detection
ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5; // Use latest engine
ocr.Configuration.EngineMode = TesseractEngineMode.TesseractAndLstm; // Best accuracy
using (var input = new OcrInput(@"r3.png"))
{
// Apply automatic image correction
input.WithTitle("Receipt Scan");
// Use computer vision to find text regions
var textRegions = input.FindTextRegions();
Console.WriteLine($"Found {textRegions.Count()} text regions");
// Apply optimal filters for receipt processing
input.ApplyOcrInputFilters();
// Perform OCR on the entire receipt
var result = ocr.Read(input);
// Display extracted text
Console.WriteLine("=== EXTRACTED RECEIPT TEXT ===");
Console.WriteLine(result.Text);
// Get detailed results
Console.WriteLine($"\n=== OCR STATISTICS ===");
Console.WriteLine($"OCR Confidence: {result.Confidence:F2}%");
Console.WriteLine($"Pages Processed: {result.Pages.Length}");
Console.WriteLine($"Paragraphs Found: {result.Paragraphs.Length}");
Console.WriteLine($"Lines Detected: {result.Lines.Length}");
Console.WriteLine($"Words Recognized: {result.Words.Length}");
// Extract any barcodes found
if (result.Barcodes.Any())
{
Console.WriteLine("\n=== BARCODES DETECTED ===");
foreach(var barcode in result.Barcodes)
{
Console.WriteLine($"Type: {barcode.Type}");
Console.WriteLine($"Value: {barcode.Value}");
Console.WriteLine($"Location: X={barcode.X}, Y={barcode.Y}");
}
}
// Save as searchable PDF
result.SaveAsSearchablePdf("receipt_searchable.pdf");
Console.WriteLine("\nSearchable PDF saved as: receipt_searchable.pdf");
// Export as hOCR for preservation
result.SaveAsHocrFile("receipt_hocr.html");
Console.WriteLine("hOCR file saved as: receipt_hocr.html");
}
}
}
Imports IronOcr
Imports System
Imports System.Linq
Class WholeReceiptExtractor
Shared Sub Main()
Dim ocr = New IronTesseract()
' Configure for receipt scanning
ocr.Configuration.ReadBarCodes = True ' Enable barcode detection
ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5 ' Use latest engine
ocr.Configuration.EngineMode = TesseractEngineMode.TesseractAndLstm ' Best accuracy
Using input = New OcrInput("r3.png")
' Apply automatic image correction
input.WithTitle("Receipt Scan")
' Use computer vision to find text regions
Dim textRegions = input.FindTextRegions()
Console.WriteLine($"Found {textRegions.Count()} text regions")
' Apply optimal filters for receipt processing
input.ApplyOcrInputFilters()
' Perform OCR on the entire receipt
Dim result = ocr.Read(input)
' Display extracted text
Console.WriteLine("=== EXTRACTED RECEIPT TEXT ===")
Console.WriteLine(result.Text)
' Get detailed results
Console.WriteLine(vbCrLf & "=== OCR STATISTICS ===")
Console.WriteLine($"OCR Confidence: {result.Confidence:F2}%")
Console.WriteLine($"Pages Processed: {result.Pages.Length}")
Console.WriteLine($"Paragraphs Found: {result.Paragraphs.Length}")
Console.WriteLine($"Lines Detected: {result.Lines.Length}")
Console.WriteLine($"Words Recognized: {result.Words.Length}")
' Extract any barcodes found
If result.Barcodes.Any() Then
Console.WriteLine(vbCrLf & "=== BARCODES DETECTED ===")
For Each barcode In result.Barcodes
Console.WriteLine($"Type: {barcode.Type}")
Console.WriteLine($"Value: {barcode.Value}")
Console.WriteLine($"Location: X={barcode.X}, Y={barcode.Y}")
Next
End If
' Save as searchable PDF
result.SaveAsSearchablePdf("receipt_searchable.pdf")
Console.WriteLine(vbCrLf & "Searchable PDF saved as: receipt_searchable.pdf")
' Export as hOCR for preservation
result.SaveAsHocrFile("receipt_hocr.html")
Console.WriteLine("hOCR file saved as: receipt_hocr.html")
End Using
End Sub
End Class
영수증 API 출력 스캔
영수증 스캔을 향상시키는 고급 기능은 무엇입니까?
IronOCR는 영수증 스캔 정확성을 크게 향상시키는 여러 고급 기능을 제공합니다:
IronOCR는 어떤 언어를 지원합니까?
- 다국어 지원: 125개 이상의 언어 또는 한 문서 내에서 여러 언어로 영수증을 처리합니다.
IronOCR가 영수증에서 바코드를 읽을 수 있습니까?
- 바코드 읽기: 바코드 및 QR 코드를 자동으로 감지하고 읽습니다.
컴퓨터 비전 기술이 영수증 처리에 어떻게 도움이 됩니까?
- 컴퓨터 비전: 고급 텍스트 감지를 사용하여 OCR 이전에 텍스트 영역을 찾습니다.
특이한 영수증 형식을 위한 맞춤형 모델을 훈련할 수 있습니까?
- 맞춤형 훈련: 특별한 영수증 형식을 위한 사용자 정의 글꼴 훈련
대량 처리 성능을 향상시키려면 어떻게 해야 합니까?
// Example: Async receipt processing for high-volume scenarios
using IronOcr;
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.IO;
class BulkReceiptProcessor
{
static async Task Main()
{
var ocr = new IronTesseract();
// Configure for optimal performance
ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5;
ocr.Configuration.UseMultiThreading = true;
ocr.Configuration.ProcessorCount = Environment.ProcessorCount;
// Process multiple receipts asynchronously
var receiptFiles = Directory.GetFiles(@"C:\Receipts\", "*.jpg");
var tasks = new List<Task<OcrResult>>();
foreach (var file in receiptFiles)
{
tasks.Add(ProcessReceiptAsync(ocr, file));
}
// Wait for all receipts to be processed
var results = await Task.WhenAll(tasks);
// Aggregate results
decimal totalAmount = 0;
foreach (var result in results)
{
// Extract total from each receipt
var match = System.Text.RegularExpressions.Regex.Match(
result.Text, @"Total:?\s*\$?(\d+\.\d{2})");
if (match.Success && decimal.TryParse(match.Groups[1].Value, out var amount))
{
totalAmount += amount;
}
}
Console.WriteLine($"Processed {results.Length} receipts");
Console.WriteLine($"Combined total: ${totalAmount:F2}");
}
static async Task<OcrResult> ProcessReceiptAsync(IronTesseract ocr, string filePath)
{
using (var input = new OcrInput(filePath))
{
// Apply preprocessing
input.DeNoise();
input.Deskew();
input.EnhanceResolution(200);
// Process asynchronously
return await ocr.ReadAsync(input);
}
}
}
// Example: Async receipt processing for high-volume scenarios
using IronOcr;
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.IO;
class BulkReceiptProcessor
{
static async Task Main()
{
var ocr = new IronTesseract();
// Configure for optimal performance
ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5;
ocr.Configuration.UseMultiThreading = true;
ocr.Configuration.ProcessorCount = Environment.ProcessorCount;
// Process multiple receipts asynchronously
var receiptFiles = Directory.GetFiles(@"C:\Receipts\", "*.jpg");
var tasks = new List<Task<OcrResult>>();
foreach (var file in receiptFiles)
{
tasks.Add(ProcessReceiptAsync(ocr, file));
}
// Wait for all receipts to be processed
var results = await Task.WhenAll(tasks);
// Aggregate results
decimal totalAmount = 0;
foreach (var result in results)
{
// Extract total from each receipt
var match = System.Text.RegularExpressions.Regex.Match(
result.Text, @"Total:?\s*\$?(\d+\.\d{2})");
if (match.Success && decimal.TryParse(match.Groups[1].Value, out var amount))
{
totalAmount += amount;
}
}
Console.WriteLine($"Processed {results.Length} receipts");
Console.WriteLine($"Combined total: ${totalAmount:F2}");
}
static async Task<OcrResult> ProcessReceiptAsync(IronTesseract ocr, string filePath)
{
using (var input = new OcrInput(filePath))
{
// Apply preprocessing
input.DeNoise();
input.Deskew();
input.EnhanceResolution(200);
// Process asynchronously
return await ocr.ReadAsync(input);
}
}
}
Imports IronOcr
Imports System
Imports System.Threading.Tasks
Imports System.Collections.Generic
Imports System.IO
Imports System.Text.RegularExpressions
Module BulkReceiptProcessor
Sub Main()
MainAsync().GetAwaiter().GetResult()
End Sub
Private Async Function MainAsync() As Task
Dim ocr As New IronTesseract()
' Configure for optimal performance
ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5
ocr.Configuration.UseMultiThreading = True
ocr.Configuration.ProcessorCount = Environment.ProcessorCount
' Process multiple receipts asynchronously
Dim receiptFiles = Directory.GetFiles("C:\Receipts\", "*.jpg")
Dim tasks As New List(Of Task(Of OcrResult))()
For Each file In receiptFiles
tasks.Add(ProcessReceiptAsync(ocr, file))
Next
' Wait for all receipts to be processed
Dim results = Await Task.WhenAll(tasks)
' Aggregate results
Dim totalAmount As Decimal = 0
For Each result In results
' Extract total from each receipt
Dim match = Regex.Match(result.Text, "Total:?\s*\$?(\d+\.\d{2})")
If match.Success AndAlso Decimal.TryParse(match.Groups(1).Value, totalAmount) Then
totalAmount += totalAmount
End If
Next
Console.WriteLine($"Processed {results.Length} receipts")
Console.WriteLine($"Combined total: ${totalAmount:F2}")
End Function
Private Async Function ProcessReceiptAsync(ocr As IronTesseract, filePath As String) As Task(Of OcrResult)
Using input As New OcrInput(filePath)
' Apply preprocessing
input.DeNoise()
input.Deskew()
input.EnhanceResolution(200)
' Process asynchronously
Return Await ocr.ReadAsync(input)
End Using
End Function
End Module
일반적인 영수증 스캔 문제를 어떻게 처리합니까?
영수증 스캔은 IronOCR가 해결하는 고유한 문제를 제공합니다:
품질이 낮은 영수증 이미지는 어떻게 처리합니까?
- 품질이 낮은 이미지: 필터 마법사를 사용하여 최적의 전처리 설정을 자동으로 찾습니다.
기울어지거나 회전된 영수증은 어떻게 처리합니까?
- 기울어지거나 회전된 영수증: 자동 페이지 회전 감지로 적절한 방향 보장
흐리거나 대비가 낮은 영수증을 어떻게 처리합니까?
손상된 영수증을 IronOCR가 처리할 수 있습니까?
- 구겨지거나 손상된 영수증: 고급 전처리로 어려운 이미지에서 텍스트 복구
다양한 영수증 형식 및 레이아웃을 어떻게 관리합니까?
영수증 형식은 소매업체 간에 크게 다릅니다. IronOCR는 유연한 접근 방식을 제공합니다:
using IronOcr;
using System;
using System.Collections.Generic;
using System.Linq;
class ReceiptLayoutHandler
{
static void Main()
{
var ocr = new IronTesseract();
// Configure for different receipt layouts
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.AutoOsd;
ocr.Configuration.EngineMode = TesseractEngineMode.TesseractAndLstm;
using (var input = new OcrInput(@"complex_receipt.jpg"))
{
// Apply region-specific processing
var cropRegion = new CropRectangle(x: 0, y: 100, width: 400, height: 800);
input.AddImage(@"complex_receipt.jpg", cropRegion);
// Process with confidence tracking
var result = ocr.Read(input);
// Parse using confidence scores
var highConfidenceLines = result.Lines
.Where(line => line.Confidence > 85)
.Select(line => line.Text)
.ToList();
// Extract data with fallback strategies
var total = ExtractTotal(highConfidenceLines)
?? ExtractTotalAlternative(result.Text);
Console.WriteLine($"Receipt Total: {total}");
}
}
static decimal? ExtractTotal(List<string> lines)
{
// Primary extraction method
foreach (var line in lines)
{
if (line.Contains("TOTAL") &&
System.Text.RegularExpressions.Regex.IsMatch(line, @"\d+\.\d{2}"))
{
var match = System.Text.RegularExpressions.Regex.Match(line, @"(\d+\.\d{2})");
if (decimal.TryParse(match.Value, out var total))
return total;
}
}
return null;
}
static decimal? ExtractTotalAlternative(string fullText)
{
// Fallback extraction method
var pattern = @"(?:Total|TOTAL|Grand Total|Amount Due).*?(\d+\.\d{2})";
var match = System.Text.RegularExpressions.Regex.Match(fullText, pattern);
if (match.Success && decimal.TryParse(match.Groups[1].Value, out var total))
return total;
return null;
}
}
using IronOcr;
using System;
using System.Collections.Generic;
using System.Linq;
class ReceiptLayoutHandler
{
static void Main()
{
var ocr = new IronTesseract();
// Configure for different receipt layouts
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.AutoOsd;
ocr.Configuration.EngineMode = TesseractEngineMode.TesseractAndLstm;
using (var input = new OcrInput(@"complex_receipt.jpg"))
{
// Apply region-specific processing
var cropRegion = new CropRectangle(x: 0, y: 100, width: 400, height: 800);
input.AddImage(@"complex_receipt.jpg", cropRegion);
// Process with confidence tracking
var result = ocr.Read(input);
// Parse using confidence scores
var highConfidenceLines = result.Lines
.Where(line => line.Confidence > 85)
.Select(line => line.Text)
.ToList();
// Extract data with fallback strategies
var total = ExtractTotal(highConfidenceLines)
?? ExtractTotalAlternative(result.Text);
Console.WriteLine($"Receipt Total: {total}");
}
}
static decimal? ExtractTotal(List<string> lines)
{
// Primary extraction method
foreach (var line in lines)
{
if (line.Contains("TOTAL") &&
System.Text.RegularExpressions.Regex.IsMatch(line, @"\d+\.\d{2}"))
{
var match = System.Text.RegularExpressions.Regex.Match(line, @"(\d+\.\d{2})");
if (decimal.TryParse(match.Value, out var total))
return total;
}
}
return null;
}
static decimal? ExtractTotalAlternative(string fullText)
{
// Fallback extraction method
var pattern = @"(?:Total|TOTAL|Grand Total|Amount Due).*?(\d+\.\d{2})";
var match = System.Text.RegularExpressions.Regex.Match(fullText, pattern);
if (match.Success && decimal.TryParse(match.Groups[1].Value, out var total))
return total;
return null;
}
}
Imports IronOcr
Imports System
Imports System.Collections.Generic
Imports System.Linq
Class ReceiptLayoutHandler
Shared Sub Main()
Dim ocr = New IronTesseract()
' Configure for different receipt layouts
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.AutoOsd
ocr.Configuration.EngineMode = TesseractEngineMode.TesseractAndLstm
Using input = New OcrInput("complex_receipt.jpg")
' Apply region-specific processing
Dim cropRegion = New CropRectangle(x:=0, y:=100, width:=400, height:=800)
input.AddImage("complex_receipt.jpg", cropRegion)
' Process with confidence tracking
Dim result = ocr.Read(input)
' Parse using confidence scores
Dim highConfidenceLines = result.Lines _
.Where(Function(line) line.Confidence > 85) _
.Select(Function(line) line.Text) _
.ToList()
' Extract data with fallback strategies
Dim total = ExtractTotal(highConfidenceLines) _
OrElse ExtractTotalAlternative(result.Text)
Console.WriteLine($"Receipt Total: {total}")
End Using
End Sub
Shared Function ExtractTotal(lines As List(Of String)) As Decimal?
' Primary extraction method
For Each line In lines
If line.Contains("TOTAL") AndAlso _
System.Text.RegularExpressions.Regex.IsMatch(line, "\d+\.\d{2}") Then
Dim match = System.Text.RegularExpressions.Regex.Match(line, "(\d+\.\d{2})")
Dim total As Decimal
If Decimal.TryParse(match.Value, total) Then
Return total
End If
End If
Next
Return Nothing
End Function
Shared Function ExtractTotalAlternative(fullText As String) As Decimal?
' Fallback extraction method
Dim pattern = "(?:Total|TOTAL|Grand Total|Amount Due).*?(\d+\.\d{2})"
Dim match = System.Text.RegularExpressions.Regex.Match(fullText, pattern)
Dim total As Decimal
If match.Success AndAlso Decimal.TryParse(match.Groups(1).Value, total) Then
Return total
End If
Return Nothing
End Function
End Class
영수증 스캔 API에 대해 기억해야 할 주요 내용을 무엇입니까?
IronOCR와 같은 영수증 스캔 API는 영수증에서 데이터 추출을 자동화하는 신뢰할 수 있는 솔루션을 제공합니다. 고급 OCR 기술을 사용하여 사업체는 자동으로 판매자 이름, 구매 날짜, 항목 목록, 가격, 세금 및 총액을 추출할 수 있습니다. 여러 언어, 통화 및 바코드 지원을 지원하여 기업은 영수증 관리를 간소화하고 시간을 절약하며 데이터 기반 의사 결정을 할 수 있습니다.
IronOCR는 개발자가 정확하고 효율적인 텍스트 추출이 가능하도록 필요한 도구를 제공하며, 작업 자동화 및 개선된 효율성을 지원합니다. 도서관의 완전한 기능 세트는 다양한 문서 유형 및 98% 메모리 감소와 같은 최근 개선 사항을 포함합니다.
필수 조건을 충족하고 IronOCR를 통합하면 자동화된 영수증 처리의 이점을 확인할 수 있습니다. 라이브러리의 문서화, 예제, 및 문제 해결 가이드가 원활한 구현을 보장합니다.
자세한 정보는 라이선스 페이지를 방문하거나 C# Tesseract OCR 튜토리얼을 탐색하십시오.
자주 묻는 질문
C#에서 OCR을 사용하여 영수증 데이터 추출을 자동화하는 방법은 무엇인가요?
IronOCR 사용하면 C#에서 영수증 데이터 추출을 자동화할 수 있습니다. IronOCR을 사용하면 영수증 이미지에서 품목, 가격, 세금, 총액과 같은 주요 세부 정보를 높은 정확도로 추출할 수 있습니다.
C#으로 영수증 스캔 프로젝트를 설정하기 위한 필수 조건은 무엇입니까?
C#으로 영수증 스캔 프로젝트를 설정하려면 Visual Studio, 기본적인 C# 프로그래밍 지식, 그리고 프로젝트에 IronOCR 라이브러리가 설치되어 있어야 합니다.
Visual Studio에서 NuGet 패키지 관리자를 사용하여 OCR 라이브러리를 설치하는 방법은 무엇인가요?
Visual Studio를 열고 도구 > NuGet 패키지 관리자 > 솔루션용 NuGet 패키지 관리로 이동하여 IronOCR 검색한 다음 프로젝트에 설치하세요.
Visual Studio 명령줄을 사용하여 OCR 라이브러리를 설치할 수 있습니까?
예, Visual Studio의 패키지 관리자 콘솔을 열고 Install-Package IronOcr 명령을 실행하여 IronOCR 설치할 수 있습니다.
OCR을 사용하여 영수증 전체에서 텍스트를 추출하는 방법은 무엇인가요?
영수증 전체에서 텍스트를 추출하려면 IronOCR 사용하여 전체 영수증 이미지에 OCR을 수행한 다음 C# 코드를 사용하여 추출된 텍스트를 출력합니다.
영수증 스캔 API는 어떤 이점을 제공하나요?
IronOCR 과 같은 영수증 스캔 API는 데이터 추출을 자동화하고, 수동 오류를 최소화하며, 생산성을 향상시키고, 더 나은 비즈니스 의사 결정을 위해 지출 패턴에 대한 통찰력을 제공합니다.
OCR 라이브러리는 다국어 및 다국어 통화를 지원합니까?
네, IronOCR 다양한 언어, 통화 및 영수증 형식을 지원하므로 글로벌 환경에 적합합니다.
이미지에서 텍스트를 추출하는 데 있어 OCR 라이브러리의 정확도는 어느 정도입니까?
IronOCR 고급 OCR 알고리즘, 컴퓨터 비전 및 머신 러닝 모델을 사용하여 까다로운 환경에서도 높은 정확도를 보장합니다.
OCR을 사용하여 영수증에서 어떤 유형의 데이터를 추출할 수 있습니까?
IronOCR 품목, 가격, 세금, 총액 및 기타 영수증 세부 정보와 같은 데이터를 추출할 수 있습니다.
영수증 분석 자동화는 비즈니스 프로세스를 어떻게 개선할 수 있을까요?
IronOCR 사용하여 영수증 분석을 자동화하면 수동 입력을 줄이고 정확한 데이터 수집을 가능하게 하며 데이터 기반 의사 결정을 지원함으로써 비즈니스 프로세스가 개선됩니다.



