IRONSOFTWAREHOME
视频

从 Tesseract 迁移到 IronOCR

Kannaopat Udonpant
Kannapat Udonpant
Updated: 2026年8月1日

本指南提供了从charlesw Tesseract NuGet软件包迁移到IronOCR的直接迁移路径。 它涵盖了消除tessdata文件夹管理、替换Pix初始化模式、添加内置预处理管道和解锁本地PDF支持的具体步骤——无需重复已在此库的比较文章中检查的材料。

为什么要从 Tesseract 迁移?

charlesw Tesseract软件包揭示了真正的OCR能力,其800万次NuGet下载证明了这一点。 摩擦点不在引擎本身,而在于你必须围绕引擎构建的基础设施,才能交付生产级产品。 四个具体痛点驱动着大多数迁移决策。

每个环境都需要tessdata文件夹管理。 在能识别一个单词之前,tessdata路径必须存在,需为应用程序需要的每种语言填充正确的TesseractEngine的路径上访问。 这意味着需要为开发机器、CI 构建、预发布服务器、生产主机和 Docker 容器分别设置文件夹。 缺失文件会在运行时抛出TesseractException: Failed to initialise tesseract engine,即在部署后,且该消息不总是标识缺失的是哪个文件。 每一个新的环境都可能再次导致这种失败。

Tesseract 4.1.1 已是最终版本。charlesw封装器仅支持 2019 年发布的 Tesseract 4.1.1 版本。Tesseract 5.x 引入了 LSTM 模型改进,在某些文档类型上显著提高了准确率。该版本已无法通过此软件包获得,并且自 2021 年以来,charlesw 封装器的维护频率已大幅降低。对于注重与当前 Tesseract 版本准确率一致的团队而言,无法通过 charlesw 封装器进行升级。

不进行预处理意味着无法依赖真实世界的文档。Tesseract需要干净、高分辨率、方向正确的输入文件。 它没有内置任何针对倾斜、噪点、低 DPI 或彩色背景的校正功能。 人工构建预处理管道——灰度转换、对比度增强、二值化、中值噪声过滤、校正倾斜——大约需要180行代码,使用OpenCvSharp4以进行适当的Hough变换校正倾斜。 然后,随着新的文档来源引入特殊情况,必须维护该流程。

**PDF格式是事后添加的,需要第二条依赖链。**合同、发票、银行对账单和合规文件都是以PDF格式交付的。 Tesseract 无法打开 PDF 文件。 要弥合这一差距,需要一个单独的 PDF 渲染库——PdfiumViewer、PDFtoImage 或 Docnet.Core——每个库都有自己的原生二进制文件、特定于平台的部署步骤和许可注意事项。 GhostScript引入了AGPL许可协议的相关问题。 密码保护的 PDF 文件又增加了一个新的库。 团队在多个环境中管理三个独立的本地依赖链,这达到了维护阈值,促使他们直接评估单包替代方案。

非线程安全的引擎设计限制了并行吞吐量。TesseractEngine实例不能跨线程共享。 标准的并行处理模式为每个线程创建一个引擎,每个实例加载 40-100 MB 的语言模型数据。 八个并行线程意味着320-800 MB的引擎初始化开销在处理任何文档之前。 这不是错误——这是线程不安全 API 的预期用法——但内存成本是真实存在的,并且随着批处理规模的增大而增加。

基本问题

每个 Tesseract 应用程序的启动方式都相同:指定一个 tessdata 路径,该路径在应用程序运行的每台机器上都必须是正确的。

超立方体方法:

// TessDataPath must exist and be populated — breaks on first clean deployment
private const string TessDataPath = @"./tessdata";

public static string ExtractText(string imagePath)
{
    // Runtime failure if eng.traineddata is missing from TessDataPath
    if (!Directory.Exists(TessDataPath))
        throw new DirectoryNotFoundException(
            $"Tessdata not found at {TessDataPath}. " +
            "Download from https://github.com/tesseract-ocr/tessdata");

    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img   = Pix.LoadFromFile(imagePath);  // Leptonica Pix object
    using var page  = engine.Process(img);
    return page.GetText();
}
C#

IronOCR方法:

// No tessdata folder. No path. No file check. Just OCR.
var text = new IronTesseract().Read("document.jpg").Text;
C#

整个using嵌套都消失了。 语言数据嵌入在NuGet包中。

IronOCR与 Tesseract:功能对比

下表列出了迁移决策中最关键的功能。

特征超立方体(charlesw)IronOCR
NuGet包TesseractIronOcr
Tesseract 引擎版本4.1.1(2019 年,置顶)优化后的 Tesseract 5.x
Tessdata 管理手动文件夹 + 文件下载捆绑式——零配置
语言包手动.traineddata下载按语言NuGet包
可用语言100+(手动)125+(NuGet)
多语言同步"eng+fra+deu"字符串OcrLanguage.French + OcrLanguage.German
图像预处理手册(约180行)内置的单行方法
德斯丘手动(需要霍夫变换)input.Deskew()
降噪手动(中值滤波)input.DeNoise()
对比度/二值化手动像素迭代input.Contrast(), input.Binarize()
深度降噪不可用input.DeepCleanBackgroundNoise()
PDF 输入无 — 需要外部库原生(扫描、数字、混合)
受密码保护的PDF需要解密库input.LoadPdf(path, Password: "...")
多页 TIFF 文件手动帧迭代input.LoadImageFrames()
可搜索的 PDF 输出不支持result.SaveAsSearchablePdf()
结构化结果访问ResultIterator循环result.Pages, .Paragraphs, .Words
线程安全不线程安全线程安全的单实例
条形码读取不支持ocr.Configuration.ReadBarCodes = true
跨平台每个平台所需的本地 DLL单个NuGet,适用于所有平台
Docker部署apt-get + tessdata COPY 步骤无需其他步骤
许可Apache 2.0(免费)永久($999 Lite / $1,499 Pro / $2,999 Enterprise)
商业支持仅限社区是的(电子邮件 + 优先级分级)

快速入门:Tesseract 到IronOCR 的迁移

步骤 1:替换 NuGet 软件包

移除 charlesw Tesseract 包装器:

dotnet remove package Tesseract
SHELL

NuGet安装IronOCR :

dotnet add package IronOcr

语言包会在需要时作为单独的软件包安装:

dotnet add package IronOcr.Languages.French, IronOcr.Languages.German

步骤 2:更新命名空间

将Tesseract命名空间替换为IronOCR命名空间:

// Before
using Tesseract;

// After
using IronOcr;
C#

步骤 3:初始化许可证

在应用程序启动时添加一次许可证初始化,在任何IronTesseract调用之前:

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

免费试用版在开发过程中无需密钥即可运行。 生产环境部署需要从许可页面获取有效的密钥。

代码迁移示例

Tessdata 路径消除和引擎初始化

最直接的变化是删除TesseractEngine初始化及其周围的所有tessdata验证代码。

超立方体方法:

// Every class that uses OCR must handle this initialization block
private const string TessDataPath = @"./tessdata";

public string RecognizeInvoiceNumber(string imagePath)
{
    // Check tessdata presence — missing file = silent runtime failure
    foreach (var lang in new[] { "eng" })
    {
        if (!File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")))
            throw new FileNotFoundException(
                $"Missing {lang}.traineddata. " +
                "Download from https://github.com/tesseract-ocr/tessdata");
    }

    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);

    // Pix is a Leptonica wrapper type — not a standard .NET image
    using var img  = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);

    string text = page.GetText();
    float  conf = page.GetMeanConfidence();

    return conf > 0.7f ? text : string.Empty;
}
C#

IronOCR方法:

using IronOcr;

public string RecognizeInvoiceNumber(string imagePath)
{
    var result = new IronTesseract().Read(imagePath);

    // Confidence property returns 0-100 double
    return result.Confidence > 70 ? result.Text : string.Empty;
}
C#

Pix对象和三级嵌套都消失了。 IronTesseract在构造时无需参数,因为语言数据是嵌入的。 当您需要非默认行为时,请参阅IronTesseract 设置指南以了解配置选项;有关完整的置信度 API,请参阅置信度评分指南

使用预处理流程进行多页 TIFF 处理

多帧 TIFF 文件(常见于扫描文档存档和传真系统)需要使用 Tesseract 进行显式帧迭代。 IronOCR一次调用即可加载所有帧,并统一应用预处理流程。

超立方体方法:

using Tesseract;
using System.Drawing;
using System.Drawing.Imaging;

private const string TessDataPath = @"./tessdata";

public static string ExtractFromMultiPageTiff(string tiffPath)
{
    var allText = new System.Text.StringBuilder();

    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var tiffImage = Image.FromFile(tiffPath);

    int frameCount = tiffImage.GetFrameCount(FrameDimension.Page);

    for (int i = 0; i < frameCount; i++)
    {
        tiffImage.SelectActiveFrame(FrameDimension.Page, i);

        // Must save each frame to disk — Pix.LoadFromFile requires a path
        string tempPath = Path.GetTempFileName() + ".png";
        try
        {
            tiffImage.Save(tempPath, ImageFormat.Png);

            using var img  = Pix.LoadFromFile(tempPath);
            using var page = engine.Process(img);
            allText.AppendLine(page.GetText());
        }
        finally
        {
            File.Delete(tempPath); // Uncleaned temp files fill disk on failure
        }
    }

    return allText.ToString();
}
C#

IronOCR方法:

using IronOcr;

public static string ExtractFromMultiPageTiff(string tiffPath)
{
    using var input = new OcrInput();
    input.LoadImageFrames(tiffPath);  // Loads all frames at once
    input.Deskew();                   // Applied to every frame uniformly
    input.DeNoise();

    var result = new IronTesseract().Read(input);
    return result.Text;
}
C#

无需帧迭代。 不创建临时文件。 没有清理逻辑。 预处理流程适用于每一帧,无需额外的循环。TIFF和 GIF 输入指南详细介绍了多帧处理,包括大型存档文件的选择性帧范围处理。

生成可搜索的 PDF 文件

将扫描的 PDF 转换为可搜索的 PDF 需要 Tesseract 将每一页渲染成图像(通过外部 PDF 库),运行 OCR,然后使用文本层重建 PDF——这是一个多库、多步骤的过程。 IronOCR在一个流程中处理输入、OCR 和输出。

超立方体方法:

// Requires: PdfiumViewer + Tesseract + a PDF writer library (iText, PdfSharp)
// Each library adds its own native dependencies and license considerations

using Tesseract;
// using PdfiumViewer;  // Comment: must add NuGet + deploy native pdfium.dll
// using iText.Kernel.Pdf;  // Comment: AGPL or commercial license required

private const string TessDataPath = @"./tessdata";

public static void CreateSearchablePdf(string inputPdfPath, string outputPdfPath)
{
    // Step 1: Render PDF pages to images (requires PdfiumViewer)
    // Step 2: Run OCR on each image (Tesseract)
    // Step 3: Write text positions back into PDF (requires iText or PDFsharp)
    //
    // Total: ~150 lines across three libraries
    // Native binaries required: tesseract*.dll, leptonica*.dll, pdfium.dll
    // License risk: iText is AGPL unless you purchase a commercial license

    throw new NotImplementedException(
        "Requires PdfiumViewer + Tesseract + a PDF writer. " +
        "No single-package solution exists with this stack.");
}
C#

IronOCR方法:

using IronOcr;

public static void CreateSearchablePdf(string inputPdfPath, string outputPdfPath)
{
    using var input = new OcrInput();
    input.LoadPdf(inputPdfPath);
    input.Deskew();    // Correct scanned page skew before OCR
    input.DeNoise();   // Remove scanner artifacts

    var result = new IronTesseract().Read(input);
    result.SaveAsSearchablePdf(outputPdfPath);
}
C#

一次方法调用即可生成带有嵌入式文本层的可搜索 PDF。 无需外部 PDF 库,无需原生 pdfium 二进制文件,也无需与 AGPL 依赖项存在许可纠纷。 这份可搜索的 PDF 使用指南详细介绍了输出格式,而PDF OCR 示例则完整演示了扫描文档的整个流程。如需更全面地了解IronOCR如何处理 PDF 输入,请参阅PDF OCR 用例页面,其中涵盖了生产架构模式。

从扫描文档中提取结构化数据

Tesseract通过do/while循环进行手动边框提取。 IronOCR将文档层次结构(页面、段落、行、单词)显示为强类型集合,其中坐标已预先填充。

超立方体方法:

using Tesseract;

private const string TessDataPath = @"./tessdata";

public static void ExtractStructuredData(string imagePath)
{
    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img    = Pix.LoadFromFile(imagePath);
    using var page   = engine.Process(img);
    using var iter   = page.GetIterator();

    iter.Begin();
    do
    {
        if (iter.IsAtBeginningOf(PageIteratorLevel.Para))
            Console.WriteLine("-- New Paragraph --");

        if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out var bounds))
        {
            string word       = iter.GetText(PageIteratorLevel.Word);
            float  confidence = iter.GetConfidence(PageIteratorLevel.Word);
            Console.WriteLine(
                $"Word: '{word?.Trim()}' " +
                $"at ({bounds.X1},{bounds.Y1})-({bounds.X2},{bounds.Y2}) " +
                $"conf={confidence:P0}");
        }
    }
    while (iter.Next(PageIteratorLevel.Word));
}
C#

IronOCR方法:

using IronOcr;

public static void ExtractStructuredData(string imagePath)
{
    var result = new IronTesseract().Read(imagePath);

    foreach (var page in result.Pages)
    {
        Console.WriteLine($"Page {page.PageNumber} — confidence: {result.Confidence}%");

        foreach (var paragraph in page.Paragraphs)
        {
            Console.WriteLine($"  Paragraph at ({paragraph.X},{paragraph.Y}):");
            Console.WriteLine($"  {paragraph.Text}");

            foreach (var word in paragraph.Words)
            {
                Console.WriteLine(
                    $"    Word: '{word.Text}' " +
                    $"at ({word.X},{word.Y}) " +
                    $"size {word.Width}x{word.Height} " +
                    $"conf={word.Confidence:P0}");
            }
        }
    }
}
C#

整个ResultIterator循环完全消失了。 文档层次结构是一组可枚举的集合——没有迭代器状态,没有手动级别跟踪,也没有通过输出参数提取边界框。 每个词对象都有自己的坐标和置信度。 读取结果指南记录了层次结构的每一级, OcrResult API 参考列出了所有可用属性。

无需 Tessdata 文件管理的多语言 OCR

将语言添加到Tesseract应用程序意味着下载一个.traineddata文件,将其放在tessdata文件夹中,更新包含该文件夹的每个部署清单,并修改引擎初始化字符串。 使用IronOCR,它只是一个NuGet包引用。

超立方体方法:

using Tesseract;

private const string TessDataPath = @"./tessdata";

public static string ExtractFromEuropeanDocument(string imagePath)
{
    // Before this call works, these files must exist:
    // ./tessdata/eng.traineddata  (~15 MB, from GitHub)
    // ./tessdata/fra.traineddata  (~15 MB, from GitHub)
    // ./tessdata/deu.traineddata  (~15 MB, from GitHub)
    // ./tessdata/spa.traineddata  (~15 MB, from GitHub)
    // Total: ~60 MB to download, version-match, and deploy to every environment

    foreach (var lang in new[] { "eng", "fra", "deu", "spa" })
    {
        if (!File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")))
            throw new FileNotFoundException(
                $"Download {lang}.traineddata from " +
                "https://github.com/tesseract-ocr/tessdata " +
                $"and place in {TessDataPath}");
    }

    // Language string is a concatenation — order affects recognition priority
    using var engine = new TesseractEngine(TessDataPath, "eng+fra+deu+spa", EngineMode.Default);
    using var img    = Pix.LoadFromFile(imagePath);
    using var page   = engine.Process(img);
    return page.GetText();
}
C#

IronOCR方法:

// Install language packs once per project:
// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.German
// dotnet add package IronOcr.Languages.Spanish
using IronOcr;

public static string ExtractFromEuropeanDocument(string imagePath)
{
    var ocr = new IronTesseract();
    ocr.Language = OcrLanguage.English;
    ocr.AddSecondaryLanguage(OcrLanguage.French);
    ocr.AddSecondaryLanguage(OcrLanguage.German);
    ocr.AddSecondaryLanguage(OcrLanguage.Spanish);

    return ocr.Read(imagePath).Text;
}
C#

tessdata文件夹、文件存在检测循环、路径连接字符串以及部署清单的更新都被.csproj中的行取代。 将语言添加到Docker意味着一个额外的dotnet add package——而不是一个Dockerfile COPY步骤。多语言指南涵盖了完整的125+语言目录和CJK字符集,而语言索引列出了每个可用的语言包。

Tesseract API 到IronOCR映射参考

超立方体(charlesw)IronOCR
new TesseractEngine(tessDataPath, "eng", EngineMode.Default)new IronTesseract()
Pix.LoadFromFile(path)ocr.Read(path)
Pix.LoadFromMemory(bytes)input.LoadImage(bytes)
engine.Process(img)ocr.Read(input)
page.GetText()result.Text
page.GetMeanConfidence()result.Confidence
page.GetHOCRText(0)result.SaveAsHocrFile(path)
engine.Process(img, tessRect)input.LoadImage(path, new CropRectangle(x, y, w, h))
page.GetIterator()result.Pages / result.Paragraphs / result.Words
iter.GetText(PageIteratorLevel.Word)result.Words[i].Text
iter.GetConfidence(PageIteratorLevel.Word)result.Words[i].Confidence
iter.TryGetBoundingBox(PageIteratorLevel.Word, out bounds)word.X, word.Y, word.Width, word.Height
"eng+fra+deu"语言字符串ocr.AddSecondaryLanguage(OcrLanguage.French)
Tessdata文件夹 + .traineddata文件NuGet语言包(IronOcr.Languages.French
不适用 — 需要 PdfiumViewer 或类似软件input.LoadPdf(path)
不适用 — 需要解密库input.LoadPdf(path, Password: "secret")
N/A — 需要iText或PDFSharpresult.SaveAsSearchablePdf(outputPath)
不适用 — 手动系统。绘制管道input.Deskew(), input.DeNoise(), input.Binarize()
N/A——线程内引擎在Parallel.ForEach单个IronTesseract在线程间共享
不适用 — 不支持ocr.Configuration.ReadBarCodes = true

常见迁移问题和解决方案

问题 1:迁移后 Tessdata 路径引用仍然存在

Tesseract: <Content Include="tessdata\**">构建项反复出现。

**解决方法:**查找所有匹配项,并将其连同 tessdata 文件夹一起删除:

# Find all tessdata references in source
grep -r "TessDataPath\|tessdata\|traineddata" --include="*.cs" .
grep -r "tessdata" --include="*.csproj" .
SHELL

移除路径常量和文件保护后,从项目中删除 tessdata 文件夹。 从<Content Include="tessdata\**" CopyToOutputDirectory="..." />行。 Dockerfile ENV TESSDATA_PREFIX环境变量声明也是安全的,可以删除。

问题 2:无法解析 Pix 对象类型

Tesseract: Tesseract名称空间的Leptonica图像包装类型。 引用出现在变量声明中(Pix.LoadFromBitmap()的代码中。

解决方案:Pix.LoadFromFile(path)。 用Pix.LoadFromMemory(bytes)System.Drawing.Bitmap对象。 无需转换为中间包装类型。 有关所有可接受的输入类型,请参阅图像输入指南流输入指南

问题 3:ResultIterator 循环模式没有直接等效项

Tesseract: 迭代iter.TryGetBoundingBox()是进行词级或字符级提取的标准模式。 这种模式需要手动跟踪迭代器状态和级别转换。

解决方案: 用LINQ遍历result.Pages或适当的集合级别替代迭代器循环:

// Before: iterator loop
using var iter = page.GetIterator();
iter.Begin();
do
{
    if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out var bounds))
    {
        string text = iter.GetText(PageIteratorLevel.Word);
        // process text and bounds
    }
}
while (iter.Next(PageIteratorLevel.Word));

// After: enumerable collection
var result = new IronTesseract().Read(imagePath);
foreach (var word in result.Words)
{
    // word.Text, word.X, word.Y, word.Width, word.Height, word.Confidence
}
C#

对于段落级访问——在Tesseract迭代器中没有干净的类比——使用result.Pages[i].Paragraphs结果解读指南记录了所有可用级别。

问题 4:必须完全移除 PDF 库代码

Tesseract: 任何在将PDF页面传递给Tesseract之前将其转换为图像的代码——PdfiumViewer document.Render()循环、PDFtoImage Conversion.ToImage()调用、Docnet.Core GetPageReader()模式或GhostScript进程调用,仅仅是用于绕过Tesseract不能打开PDF的问题。 这些类、循环、临时文件模式和原生二进制部署都是围绕真正需求搭建的脚手架。

**解决方法:**完全删除PDF渲染代码。 用input.LoadPdf(path)替换整个渲染然后OCR的块:

// Before: ~50-150 lines of PdfiumViewer + Tesseract + temp file management
// After:
using var input = new OcrInput();
input.LoadPdf("document.pdf");
input.Deskew();
input.DeNoise();
var result = new IronTesseract().Read(input);
C#

.csproj中移除PdfiumViewer、PDFtoImage和Docnet.Core软件包引用。 从构建脚本和Dockerfiles中移除本机二进制部署(pdfium.dll, GhostScript可执行文件)。 PDF 输入指南涵盖页面范围选择和密码保护的 PDF。

问题 5:每个线程一个并行处理引擎模式

Tesseract: 为安全的并行OCR创建新的Parallel.ForEach体内是标准模式,因为单个引擎不是线程安全。 这将为每个线程加载完整的语言模型。

解决方案: 在循环之前创建IronTesseract一次并在内部引用它:

// Before: engine per thread, 40-100 MB per language model, times thread count
Parallel.ForEach(files, file =>
{
    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img    = Pix.LoadFromFile(file);
    using var page   = engine.Process(img);
    results[file] = page.GetText();
});

// After: single engine, thread-safe, shared pool
var ocr = new IronTesseract();
Parallel.ForEach(files, file =>
{
    var result = ocr.Read(file);
    results[file] = result.Text;
});
C#

线程安全的变化也消除了循环体内的using处置模式,这在过去是必要的,以确保每个线程内的引擎及时释放。

问题 6:EngineMode 枚举没有直接映射

Tesseract: EngineMode.Default, TesseractEngine构造函数中出现,用于选择Tesseract是使用传统引擎、LSTM还是两者兼用。 charlesw 包装器公开了这些模式,因为 Tesseract 4.x 保留了这两个引擎。

解决方案: IronOCR完全采用 Tesseract 5 LSTM 引擎,这是高精度配置。 因为没有传统引擎可供回退,所以不存在EngineMode参数。 在翻译构造函数调用时删除EngineMode参数。 对于吞吐量与准确性的调优,使用ocr.Configuration.PageSegmentationMode并查阅速度优化指南

Tesseract 迁移检查清单

迁移前

审核代码库中所有对 Tesseract 和 tessdata 的引用:

# Find all using directives for the Tesseract namespace
grep -rn "using Tesseract" --include="*.cs" .

# Find TesseractEngine constructors
grep -rn "TesseractEngine\|TessDataPath\|tessdata" --include="*.cs" .

# Find Pix object usage
grep -rn "Pix\." --include="*.cs" .

# Find ResultIterator usage
grep -rn "GetIterator\|ResultIterator\|PageIteratorLevel" --include="*.cs" .

# Find PDF rendering libraries added for Tesseract
grep -rn "PdfiumViewer\|PDFtoImage\|Docnet\|GhostScript" --include="*.cs" .

# Find tessdata references in project files
grep -rn "tessdata\|traineddata" --include="*.csproj" .

# Find tessdata references in Dockerfiles
grep -rn "tessdata\|TESSDATA_PREFIX\|libtesseract" Dockerfile* .
SHELL

清点结果用于估算迁移范围:

  • 使用using Tesseract统计文件以确定有多少类需要更改
  • 确定正在使用的 PDF 渲染库(PdfiumViewer、PDFtoImage、Docnet.Core、GhostScript)
  • 注意在TesseractEngine构造函数字符串中引用了哪些语言以确定需要添加哪些IronOCR语言NuGet包

代码迁移

  1. 从所有Tesseract NuGet软件包引用
  2. 移除仅为支持 Tesseract 而添加的 PDF 渲染库NuGet引用(PdfiumViewer、PDFtoImage、Docnet.Core)
  3. 安装IronOcr NuGet软件包
  4. 安装所需的语言NuGet包(IronOcr.Languages.French,等等)
  5. 在应用程序启动时添加IronOcr.License.LicenseKey = "YOUR-KEY";
  6. 在所有受影响的文件中用using Tesseract;
  7. 移除Directory.Exists / File.Exists tessdata保护
  8. new TesseractEngine(...)
  9. Pix.LoadFromFile(path)
  10. Pix.LoadFromMemory(bytes)
  11. engine.Process(img)
  12. page.GetText()
  13. page.GetMeanConfidence()
  14. 用枚举遍历ResultIterator循环
  15. input.LoadPdf(path)替换PDF渲染循环——完全删除渲染库代码
  16. "eng+fra+deu"语言字符串
  17. 删除tessdata文件夹及其构建<Content Include="...">项目项
  18. 从构建脚本和 Dockerfile 中移除原生二进制部署步骤(tessdata COPY、TESSDATA_PREFIX ENV、apt-get libtesseract-dev)

后迁移

  • 使用 Tesseract 封装器,对开发过程中使用的相同示例图像进行基本文本提取验证。
  • 确认置信度评分合理(干净文档70%以上,高质量扫描件85%以上)
  • 测试多页TIFF输入在result.Pages产生正确的页数
  • 验证 PDF 输入是否无需 PdfiumViewer 或任何外部库即可读取扫描的 PDF 文件
  • 使用input.LoadPdf(path, Password: "...")测试受密码保护的PDF读取,针对已知加密文件
  • 确认可搜索的 PDF 输出文件能在 Adob​​e Reader 中打开并支持文本搜索
  • 测试并行处理:在IronTesseract实例并确认没有线程安全异常
  • 验证每个语言包都能为目标语言文档集生成正确的输出。
  • 在没有apt-get libtesseract-dev的情况下运行Docker构建——确认容器启动并处理文档
  • 确认已发布的输出目录中不存在 tessdata 文件夹和本地 DLL 文件
  • 检查移除本机二进制引用后日志中没有出现System.DllNotFoundException

迁移到IronOCR的主要优势

部署缩减为单个包。 tessdata文件夹、特定平台的本机库(tesseract50.dll, leptonica-1.82.0.dll, libtesseract.so.5)以及任何PDF渲染本机二进制文件从部署工件中消失。 添加新环境(Linux 容器、AWS Lambda 函数、macOS 开发机)无需任何特定于平台的设置步骤。 Docker 部署指南Linux 部署指南确认了该过程:安装软件包,添加许可证密钥,运行。 不使用 apt-get,不使用 COPY,也不使用环境变量。

语言添加仅需几秒钟而非几分钟。 添加西班牙文OCR支持从"下载ocr.AddSecondaryLanguage(OcrLanguage.Spanish)。 这两个步骤在所有平台上都适用。 支持 10 种以上语言的团队(这在跨国文档处理工作流程中很常见)会发现,此功能可以将持续维护所需的数小时缩短到一次性设置所需的几分钟。浏览语言索引即可查看完整目录。

**PDF 工作流程无需外部库。**部署和维护 PdfiumViewer 本地二进制文件、管理 pdfium.dll 在 32 位/64 位环境下的位数、处理 GhostScript 中的 AGPL 许可问题以及编写逐页渲染循环等需求都不再需要。 input.LoadPdf()读取扫描的PDF、数字PDF、混合内容PDF和受密码保护的PDF。 result.SaveAsSearchablePdf()生成可搜索的输出,不涉及任何二级库。 整个往返过程——加载扫描的 PDF、校正倾斜和降噪、OCR、保存可搜索的输出——只需不到 10 行代码。 请参阅可搜索的 PDF 博客文章,了解生产流程模式。

预处理是内置的,而不是由您构建的。 约180行的手动预处理代码——灰度颜色矩阵、像素迭代对比度增强、中值滤波噪声去除、Hough变换校正倾斜、DPI缩放——变成一系列单行方法调用:input.Deskew(), input.DeNoise(), input.Contrast(), input.Binarize()。 对于大多数现实世界的文档,默认读取操作会应用智能自动预处理,完全不需要显式的过滤器调用。 图像质量校正指南图像滤镜教程涵盖了所有滤镜目录。

Tesseract 5 的准确率现已可用。charlesw封装器与 Tesseract 4.1.1 版本绑定。IronOCR 提供了一个优化的 TesseractIronOCRLSTM 引擎,无需您进行任何操作。 那些在处理难度较大的文档类型(低 DPI 扫描件、传真件、手写表格)时发现准确性下降的团队,一旦切换到 Tesseract 5 软件包,就能立即获得 Tesseract 5 的改进。 在 LSTM 识别性能优于传统引擎的文档上,准确率差异最为明显,这涵盖了现实世界中绝大多数的 OCR 工作负载。

商业支持取代了社区故障排除。charlesw封装器是一个由社区维护的开源项目,不保证响应时间,也不提供服务级别协议 (SLA)。 IronOCR提供电子邮件支持、更高级别的优先支持,以及商业维护的代码库,并定期进行.NET兼容性更新。 对于有生产文档处理管道服务级别协议 (SLA) 的团队来说,这种支持模式至关重要。 IronOCR产品页面文档中心涵盖了全部功能和部署选项。

请注意: Ghostscript、PDFium、PDFSharp、Tesseract 和 iText 是各自所有者的注册商标。 本网站与 Artifex Software、Chromium Project、Google、empira Software GmbH 或 iText Group 无关,也未获得其认可或赞助。所有产品名称、徽标和商标均为其各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户