var result = new IronTesseract().ReadDocumentAdvanced(new OcrInput("scan.png"));foreach (var word in result.Words)Console.WriteLine($"{word.Text} @ ({word.X},{word.Y}) conf:{word.RegionConfidence:P0}");
var result = new IronTesseract().ReadDocumentAdvanced(new OcrInput("scan.png"));
foreach (var word in result.Words)
Console.WriteLine($"{word.Text} @ ({word.X},{word.Y}) conf:{word.RegionConfidence:P0}");
为重建自然的自上而下、从左至右的排列顺序,请先按 Y 坐标对集合进行排序,然后在每行内按 X 坐标排序。通过设置较小的 Y 坐标容差,可将位于同一基线上的 WORD 归为一组。
using IronOcr;using System.Linq;var ocr = new IronTesseract();using var input = new OcrInput();input.LoadImage("multi-column-doc.png");var result = ocr.ReadDocumentAdvanced(input);int targetPage = 1;int lineThreshold = 10; // pixel tolerance for grouping same-line words// Sort by line (Y), then left-to-right (X)var pageWords = result.Words .Where(w => w.PageNumber == targetPage) .OrderBy(w => w.Y / lineThreshold) .ThenBy(w => w.X) .ToList();foreach (var word in pageWords){Console.Write($"{word.Text} ");}Console.WriteLine();
using IronOcr;
using System.Linq;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("multi-column-doc.png");
var result = ocr.ReadDocumentAdvanced(input);
int targetPage = 1;
int lineThreshold = 10; // pixel tolerance for grouping same-line words
// Sort by line (Y), then left-to-right (X)
var pageWords = result.Words
.Where(w => w.PageNumber == targetPage)
.OrderBy(w => w.Y / lineThreshold)
.ThenBy(w => w.X)
.ToList();
foreach (var word in pageWords)
{
Console.Write($"{word.Text} ");
}
Console.WriteLine();
ImportsIronOcrImportsSystem.LinqDim ocr As New IronTesseract()Using input As New OcrInput() input.LoadImage("multi-column-doc.png") Dim result = ocr.ReadDocumentAdvanced(input) Dim targetPage AsInteger = 1 Dim lineThreshold AsInteger = 10 ' pixel tolerance for grouping same-line words ' Sort by line (Y), then left-to-right (X) Dim pageWords = result.Words _ .Where(Function(w) w.PageNumber = targetPage) _ .OrderBy(Function(w) w.Y \ lineThreshold) _ .ThenBy(Function(w) w.X) _ .ToList() For Each word In pageWordsConsole.Write($"{word.Text} ") NextConsole.WriteLine()EndUsing
Imports IronOcr
Imports System.Linq
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage("multi-column-doc.png")
Dim result = ocr.ReadDocumentAdvanced(input)
Dim targetPage As Integer = 1
Dim lineThreshold As Integer = 10 ' pixel tolerance for grouping same-line words
' Sort by line (Y), then left-to-right (X)
Dim pageWords = result.Words _
.Where(Function(w) w.PageNumber = targetPage) _
.OrderBy(Function(w) w.Y \ lineThreshold) _
.ThenBy(Function(w) w.X) _
.ToList()
For Each word In pageWords
Console.Write($"{word.Text} ")
Next
Console.WriteLine()
End Using
using IronOcr;using System.Linq;var ocr = new IronTesseract();using var input = new OcrInput();input.LoadImage("noisy-scan.png");var result = ocr.ReadDocumentAdvanced(input);double threshold = 0.75;var highConfidenceWords = result.Words .Where(w => w.Confidence >= threshold) .ToList();var lowConfidenceWords = result.Words .Where(w => w.Confidence < threshold) .ToList();Console.WriteLine($"Accepted: {highConfidenceWords.Count} words");Console.WriteLine($"Rejected: {lowConfidenceWords.Count} words");// Log rejected words for manual reviewforeach (var word in lowConfidenceWords){Console.WriteLine( $" LOW CONF: '{word.Text}' at ({word.X},{word.Y}) — {word.Confidence:P1}" );}
using IronOcr;
using System.Linq;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("noisy-scan.png");
var result = ocr.ReadDocumentAdvanced(input);
double threshold = 0.75;
var highConfidenceWords = result.Words
.Where(w => w.Confidence >= threshold)
.ToList();
var lowConfidenceWords = result.Words
.Where(w => w.Confidence < threshold)
.ToList();
Console.WriteLine($"Accepted: {highConfidenceWords.Count} words");
Console.WriteLine($"Rejected: {lowConfidenceWords.Count} words");
// Log rejected words for manual review
foreach (var word in lowConfidenceWords)
{
Console.WriteLine(
$" LOW CONF: '{word.Text}' at ({word.X},{word.Y}) — {word.Confidence:P1}"
);
}
using IronOcr;var ocr = new IronTesseract();using var input = new OcrInput();input.LoadImage("form-field.png");var result = ocr.ReadDocumentAdvanced(input);foreach (var ch in result.Characters){Console.WriteLine( $"'{ch.Text}' | " + $"Box: ({ch.X}, {ch.Y}, {ch.Width}, {ch.Height}) | " + $"Page {ch.PageNumber}" );}// ToString() override provides diagnostic-friendly outputConsole.WriteLine(result.Characters.First().ToString());
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("form-field.png");
var result = ocr.ReadDocumentAdvanced(input);
foreach (var ch in result.Characters)
{
Console.WriteLine(
$"'{ch.Text}' | " +
$"Box: ({ch.X}, {ch.Y}, {ch.Width}, {ch.Height}) | " +
$"Page {ch.PageNumber}"
);
}
// ToString() override provides diagnostic-friendly output
Console.WriteLine(result.Characters.First().ToString());
ImportsIronOcrDim ocr = New IronTesseract()Using input = New OcrInput() input.LoadImage("form-field.png") Dim result = ocr.ReadDocumentAdvanced(input) For Each ch In result.CharactersConsole.WriteLine($"'{ch.Text}' | Box: ({ch.X}, {ch.Y}, {ch.Width}, {ch.Height}) | Page {ch.PageNumber}") Next ' ToString() override provides diagnostic-friendly outputConsole.WriteLine(result.Characters.First().ToString())EndUsing
Imports IronOcr
Dim ocr = New IronTesseract()
Using input = New OcrInput()
input.LoadImage("form-field.png")
Dim result = ocr.ReadDocumentAdvanced(input)
For Each ch In result.Characters
Console.WriteLine($"'{ch.Text}' | Box: ({ch.X}, {ch.Y}, {ch.Width}, {ch.Height}) | Page {ch.PageNumber}")
Next
' ToString() override provides diagnostic-friendly output
Console.WriteLine(result.Characters.First().ToString())
End Using
请注意: Words 和 Characters 都是被懒加载并缓存的。 首次访问将触发计算; 后续访问将返回缓存结果,因此第二次迭代无需任何成本。
using IronOcr;using IronSoftware.Drawing;var ocr = new IronTesseract();using var input = new OcrInput();input.LoadImage("invoice.png");var result = ocr.ReadDocumentAdvanced(input);// Load the original image for croppingvar originalImage = AnyBitmap.FromFile("invoice.png");// Find a specific word and crop its regionvar targetWord = result.Words.FirstOrDefault(w => w.Text == "Total");if (targetWord != null){ Rectangle cropRect = targetWord.BoundingBox; AnyBitmap croppedRegion = originalImage.Clone(cropRect); croppedRegion.SaveAs("total-region.png");Console.WriteLine( $"Cropped '{targetWord.Text}' from " + $"({cropRect.X}, {cropRect.Y}, {cropRect.Width}, {cropRect.Height})" );}
using IronOcr;
using IronSoftware.Drawing;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("invoice.png");
var result = ocr.ReadDocumentAdvanced(input);
// Load the original image for cropping
var originalImage = AnyBitmap.FromFile("invoice.png");
// Find a specific word and crop its region
var targetWord = result.Words.FirstOrDefault(w => w.Text == "Total");
if (targetWord != null)
{
Rectangle cropRect = targetWord.BoundingBox;
AnyBitmap croppedRegion = originalImage.Clone(cropRect);
croppedRegion.SaveAs("total-region.png");
Console.WriteLine(
$"Cropped '{targetWord.Text}' from " +
$"({cropRect.X}, {cropRect.Y}, {cropRect.Width}, {cropRect.Height})"
);
}
ImportsIronOcrImportsIronSoftware.DrawingDim ocr As New IronTesseract()Using input As New OcrInput() input.LoadImage("invoice.png") Dim result = ocr.ReadDocumentAdvanced(input) ' Load the original image for cropping Dim originalImage = AnyBitmap.FromFile("invoice.png") ' Find a specific word and crop its region Dim targetWord = result.Words.FirstOrDefault(Function(w) w.Text = "Total") If targetWord IsNot Nothing Then Dim cropRect AsRectangle = targetWord.BoundingBox Dim croppedRegion AsAnyBitmap = originalImage.Clone(cropRect) croppedRegion.SaveAs("total-region.png")Console.WriteLine( $"Cropped '{targetWord.Text}' from " & $"({cropRect.X}, {cropRect.Y}, {cropRect.Width}, {cropRect.Height})" ) End IfEndUsing
Imports IronOcr
Imports IronSoftware.Drawing
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage("invoice.png")
Dim result = ocr.ReadDocumentAdvanced(input)
' Load the original image for cropping
Dim originalImage = AnyBitmap.FromFile("invoice.png")
' Find a specific word and crop its region
Dim targetWord = result.Words.FirstOrDefault(Function(w) w.Text = "Total")
If targetWord IsNot Nothing Then
Dim cropRect As Rectangle = targetWord.BoundingBox
Dim croppedRegion As AnyBitmap = originalImage.Clone(cropRect)
croppedRegion.SaveAs("total-region.png")
Console.WriteLine(
$"Cropped '{targetWord.Text}' from " &
$"({cropRect.X}, {cropRect.Y}, {cropRect.Width}, {cropRect.Height})"
)
End If
End Using
How can OCR results be used for custom font training or machine learning?
OCR results, including cropped image regions and labeled datasets derived from bounding boxes, can be used to train custom fonts or feed machine learning pipelines. IronOCR facilitates these processes with its detailed spatial data extraction capabilities.