如何在 C# 中对 PDF 进行 OCR 识别:使用.NET从扫描文档中提取文本
扫描的 PDF 文档给.NET开发人员带来了一个持续的挑战:文本仅以图像形式存在,因此无法进行搜索、复制或以编程方式处理。 光学字符识别 (OCR) 通过将扫描图像转换为可编辑和可搜索的数据来解决这个问题——将纸质文档、相机拍摄的图像或任何基于图像的 PDF 文件转换为机器可读的文本。 无论是数字化纸质档案、自动化数据提取,还是构建文档处理流程,在 C# 中对 PDF 文件执行 OCR 的能力都是一项至关重要的能力。
IronOCR是一个基于 Tesseract 5 引擎构建的.NET OCR 库,并具有额外的精度增强功能。 它允许开发人员使用少量代码从任何 PDF 文档(扫描或其他方式)中提取文本。 本文将介绍核心工作流程:基本 PDF OCR、页面选择性处理、区域目标提取以及针对复杂扫描的图像预处理。
如何在 C# 中对 PDF 文件进行 OCR 识别?
在.NET中,提取 PDF 文本的最快方法是通过NuGet安装IronOCR 。 在项目目录中打开终端并运行:
dotnet add package IronOcr
dotnet add package IronOcr
安装该软件包后,以下顶级语句程序会读取扫描的 PDF 文件并打印其提取的文本:
using IronOcr;
// Initialize the OCR engine
var ocr = new IronTesseract();
// Load the PDF and perform OCR
using var input = new OcrInput();
input.LoadPdf("scanned-report.pdf");
// Run recognition
OcrResult result = ocr.Read(input);
// Access the extracted text
string text = result.Text;
Console.WriteLine(text);
using IronOcr;
// Initialize the OCR engine
var ocr = new IronTesseract();
// Load the PDF and perform OCR
using var input = new OcrInput();
input.LoadPdf("scanned-report.pdf");
// Run recognition
OcrResult result = ocr.Read(input);
// Access the extracted text
string text = result.Text;
Console.WriteLine(text);
Imports IronOcr
' Initialize the OCR engine
Dim ocr As New IronTesseract()
' Load the PDF and perform OCR
Using input As New OcrInput()
input.LoadPdf("scanned-report.pdf")
' Run recognition
Dim result As OcrResult = ocr.Read(input)
' Access the extracted text
Dim text As String = result.Text
Console.WriteLine(text)
End Using
IronTesseract 类封装了 Tesseract 5,并针对 .NET Core 和 .NET Framework 目标进行了 .NET 原生优化。 OcrInput 对象管理 PDF 加载和内部页面渲染。 当调用 Read 时,OCR 过程会分析每一页,并返回一个 OcrResult,其中包含完整的提取文本,以及有关段落、行、单词及其像素坐标的结构化数据。
结果可以写入文本文件、传递给下游处理逻辑、存储在数据库中,或输入到文档索引管道中。有关底层引擎的更多信息,请参阅Tesseract OCR 文档和IronOCR API 参考文档。
输入
!a href="/static-assets/ocr/blog/net-ocr-pdf/net-ocr-pdf-1.webp">How to OCR a PDF:使用 C# .NET OCR PDF 从扫描文档中提取文本:图片 1 - PDF 输入示例。
输出
!a href="/static-assets/ocr/blog/net-ocr-pdf/net-ocr-pdf-2.webp">How to OCR a PDF:使用 C# .NET OCR PDF 从扫描文件中提取文本:图像 2 - 控制台输出。
如何读取PDF文件中的特定页面?
如果只有某些页面包含相关内容,处理长文档的每一页都会浪费时间和内存。 IronOCR 允许您通过将从零开始的页面索引传递给 LoadPdf 来定位特定页面:
using IronOcr;
using System.Collections.Generic;
var ocr = new IronTesseract();
// Specify pages to process (zero-based: 0 = first page)
var targetPages = new List<int> { 0, 2, 4 };
using var input = new OcrInput();
input.LoadPdf("lengthy-document.pdf", pageIndices: targetPages);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
using System.Collections.Generic;
var ocr = new IronTesseract();
// Specify pages to process (zero-based: 0 = first page)
var targetPages = new List<int> { 0, 2, 4 };
using var input = new OcrInput();
input.LoadPdf("lengthy-document.pdf", pageIndices: targetPages);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Imports System.Collections.Generic
Dim ocr As New IronTesseract()
' Specify pages to process (zero-based: 0 = first page)
Dim targetPages As New List(Of Integer) From {0, 2, 4}
Using input As New OcrInput()
input.LoadPdf("lengthy-document.pdf", pageIndices:=targetPages)
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
选择性页面加载可以减少处理时间和内存消耗,这在处理数百页的归档文件时非常重要,因为其中只有少数几页包含所需的数据。 从零开始的索引约定与标准的.NET集合一致:页面索引 0 是文档的第一页。
对于事先不知道相关页面的文档,可以考虑先以降低 DPI 的速度快速扫描整个文档,以确定页码,然后再以完整的设置对这些页面重新扫描。
有关IronOCR页面选择文档中页面级控制的更多信息。
如何从页面的特定区域提取数据?
发票处理、表格数字化和结构化文档解析通常需要从指定区域提取文本,而不是扫描整个页面。 IronOCR 通过 ContentAreas 参数支持区域定向 OCR,该参数接受一个 Rectangle 对象数组,用于指定要分析的每个页面的哪些部分:
using IronOcr;
using IronSoftware.Drawing;
var ocr = new IronTesseract();
// Define the scan region: X, Y, Width, Height (all in pixels from top-left)
var invoiceFields = new Rectangle[]
{
new Rectangle(130, 290, 250, 50) // Invoice number field
};
using var input = new OcrInput();
input.LoadPdf("invoice.pdf", contentAreas: invoiceFields);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
using IronSoftware.Drawing;
var ocr = new IronTesseract();
// Define the scan region: X, Y, Width, Height (all in pixels from top-left)
var invoiceFields = new Rectangle[]
{
new Rectangle(130, 290, 250, 50) // Invoice number field
};
using var input = new OcrInput();
input.LoadPdf("invoice.pdf", contentAreas: invoiceFields);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Imports IronSoftware.Drawing
Dim ocr As New IronTesseract()
' Define the scan region: X, Y, Width, Height (all in pixels from top-left)
Dim invoiceFields As Rectangle() = {
New Rectangle(130, 290, 250, 50) ' Invoice number field
}
Using input As New OcrInput()
input.LoadPdf("invoice.pdf", contentAreas:=invoiceFields)
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
Rectangle 构造函数接受四个整数参数:X 坐标、Y 坐标、宽度和高度——所有尺寸均以像素为单位,从渲染页面的左上角开始测量。 以小区域而非整个页面为目标,既可以减少 OCR 时间,又能降低引擎识别周围噪声或无关文本字段的可能性。
对于批量发票处理工作流程,将区域提取与遍历 result.Pages 进行迭代相结合,以从数百个文档的同一字段位置提取结构化数据。 每个页面结果都会独立地显示其内容区域中识别出的文本。
IronOCR内容区域示例为多区域场景提供了额外的配置选项。
输入
!a href="/static-assets/ocr/blog/net-ocr-pdf/net-ocr-pdf-3.webp">How to OCR a PDF:使用 C# .NET OCR PDF 从扫描文件中提取文本:图片 3 - 样本发票。
输出
!a href="/static-assets/ocr/blog/net-ocr-pdf/net-ocr-pdf-4.webp">How to OCR a PDF:使用 C# .NET OCR PDF 从扫描文件中提取文本:图像 4 - 提取的数据输出。
如何提高扫描文档的OCR识别准确率?
现实世界中扫描的文档经常会出现质量问题:页面倾斜、分辨率低,或者扫描硬件或软件引入了数字噪声。 IronOCR包含一组图像预处理过滤器,可在识别引擎运行之前纠正这些问题:
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
// Load PDF at higher DPI for improved text recognition on small fonts
input.LoadPdf("poor-quality-scan.pdf", dpi: 300);
// Apply image correction filters
input.Deskew(); // Automatically straighten rotated pages
input.DeNoise(); // Remove scanning artifacts and speckles
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
// Load PDF at higher DPI for improved text recognition on small fonts
input.LoadPdf("poor-quality-scan.pdf", dpi: 300);
// Apply image correction filters
input.Deskew(); // Automatically straighten rotated pages
input.DeNoise(); // Remove scanning artifacts and speckles
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Dim ocr = New IronTesseract()
Using input = New OcrInput()
' Load PDF at higher DPI for improved text recognition on small fonts
input.LoadPdf("poor-quality-scan.pdf", dpi:=300)
' Apply image correction filters
input.Deskew() ' Automatically straighten rotated pages
input.DeNoise() ' Remove scanning artifacts and speckles
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
dpi 参数控制在识别运行之前渲染 PDF 页面的分辨率。 更高的分辨率(200 至 300 DPI)可以提高文本较小或较密集的文档的精度,但处理过程中会占用更多内存。 Deskew 方法可以自动检测和纠正页面旋转。 DeNoise 可去除可能干扰字符识别步骤的斑点和伪影。
对于需要更彻底的图像校正的文档, IronOCR还提供对比度增强、二值化(将页面转换为黑白)和缩放调整。 将多个过滤器按顺序组合使用,可以从原本会产生乱码输出的扫描件中恢复可用的文本。 请参阅IronOCR图像过滤器参考文档,了解所有可用的预处理操作的完整列表。
如何处理受密码保护和多格式的文档?
IronOCR不仅限于标准 PDF 文件。 该库可处理文档处理工作流程中经常出现的各种输入场景。
支持通过在输入构建过程中传递凭据来启用密码保护的 PDF 文件:
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("protected.pdf", password: "secret123");
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("protected.pdf", password: "secret123");
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadPdf("protected.pdf", password:="secret123")
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
图像格式——PNG、JPEG、TIFF、BMP、GIF 和多页 TIFF——通过相应的 LoadImage 或 LoadImageFrames 方法加载。 无论输入格式如何,都适用相同的预处理过滤器和区域定位选项。
多语言文档通过 IronOCR 的语言包系统进行处理。 该库默认包含英文,并支持超过 125 种其他语言包,涵盖拉丁文、西里尔文、中日韩文、阿拉伯文和其他文字。请在调用 Read 之前加载其他语言:
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.German;
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.German;
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.German
对于同一页面上混合多种语言的文档,可以使用 MultiLanguage 模式。 这对于国际环境下的发票处理尤其有价值,因为发票的抬头、明细项目和地址可能以不同的语言出现。
部署可在 Windows、Linux、macOS 和云环境(包括 Azure 和 Docker 容器)中进行。
如何从扫描文档创建可搜索的PDF?
除了将文本提取为字符串之外, IronOCR还可以生成可搜索的 PDF 输出——在 PDF 中,原始扫描图像作为视觉层保留,同时嵌入一个不可见的文本层以进行搜索和复制操作。 这是Professional文档扫描仪生成的标准格式。
IronOCR 可搜索 PDF 功能接受 OcrResult 并写入一个新的 PDF 文件:
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("scanned-archive.pdf");
OcrResult result = ocr.Read(input);
// Save as a searchable PDF
result.SaveAsSearchablePdf("output-searchable.pdf");
using IronOcr;
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("scanned-archive.pdf");
OcrResult result = ocr.Read(input);
// Save as a searchable PDF
result.SaveAsSearchablePdf("output-searchable.pdf");
Imports IronOcr
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadPdf("scanned-archive.pdf")
Dim result As OcrResult = ocr.Read(input)
' Save as a searchable PDF
result.SaveAsSearchablePdf("output-searchable.pdf")
End Using
输出文件可以使用任何PDF阅读器打开。 文本选择、搜索和复制操作在嵌入的文本层上进行,同时保留原始扫描外观。 这种格式通常是合规性档案、法律文件库和Enterprise内容管理系统所必需的。
对于其他输出格式,OcrResult 对象还公开了每页置信度分数、单词级边界框和结构化段落数据——所有这些都对下游分类或索引任务很有用。
如何同时读取条形码、二维码和文本?
文档处理流程通常需要从同一文档中提取人类可读的文本和机器可读的代码。 IronOCR可以在一次 OCR 过程中检测和解码条形码和二维码,而无需单独的库。
在处理之前,请先在 IronTesseract 实例上启用条形码读取功能:
using IronOcr;
var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;
using var input = new OcrInput();
input.LoadPdf("shipment-labels.pdf");
OcrResult result = ocr.Read(input);
// Access recognized text
Console.WriteLine(result.Text);
// Access barcode data
foreach (var barcode in result.Barcodes)
{
Console.WriteLine($"Type: {barcode.Format}, Value: {barcode.Value}");
}
using IronOcr;
var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;
using var input = new OcrInput();
input.LoadPdf("shipment-labels.pdf");
OcrResult result = ocr.Read(input);
// Access recognized text
Console.WriteLine(result.Text);
// Access barcode data
foreach (var barcode in result.Barcodes)
{
Console.WriteLine($"Type: {barcode.Format}, Value: {barcode.Value}");
}
Imports IronOcr
Dim ocr As New IronTesseract()
ocr.Configuration.ReadBarCodes = True
Using input As New OcrInput()
input.LoadPdf("shipment-labels.pdf")
Dim result As OcrResult = ocr.Read(input)
' Access recognized text
Console.WriteLine(result.Text)
' Access barcode data
For Each barcode In result.Barcodes
Console.WriteLine($"Type: {barcode.Format}, Value: {barcode.Value}")
Next
End Using
这对于货运标签处理、库存管理以及任何条形码和打印文本同时出现在扫描文档上的工作流程都特别有用。 IronOCR条形码读取指南涵盖支持的格式,包括 Code 128、QR 码、Data Matrix 和 PDF417。
IronOCR输入类型之间有什么区别?
IronOCR提供了两种加载 PDF 文件的主要方法,每种方法都适用于不同的场景:
| 方法 | 类别 | 最适合 | 注意事项 |
|---|---|---|---|
| 一般性输入 | OcrInput.LoadPdf() |
大多数用例 | 支持所有预处理过滤器、页面选择和内容区域 |
| PDF专用 | OcrPdfInput |
简单场景 | 便捷包装;配置选项较少 |
| 图像文件 | OcrInput.LoadImage() |
PNG、JPEG、TIFF、BMP | 与 PDF 输入相同的预处理和区域定位方法 |
| 多页TIFF | OcrInput.LoadImageFrames() |
传真存档,扫描仪输出 | 将每一帧作为单独的页面进行处理 |
对于大多数生产场景,推荐使用 OcrInput.LoadPdf(),因为它公开了完整的预处理和配置 API。 OcrPdfInput 适用于快速原型设计或默认设置足以满足需求的情况。
下一步计划是什么?
以上代码示例涵盖了IronOCR在 C# 中用于 PDF OCR 的核心工作流程。 以下是进行下一步操作的简要清单:
-安装软件包:dotnet add package IronOcr 或在 NuGet 上搜索 IronOcr
-运行基本示例:在构建完整的流程逻辑之前,确认能够从示例 PDF 中提取文本。
-应用预处理:如果处理的是扫描文档,请添加 Deskew 和 DeNoise 调用,并使用代表性样本进行测试。
-探索更多功能:可搜索的 PDF 输出、条形码读取、多语言支持和结构化数据输出
-查看部署指南:Azure、Docker 和 Linux 部署文章涵盖了特定于环境的配置。
-试用免费版:在购买许可证之前,先开始免费试用,体验所有功能。
-获取许可: IronOCR 的许可选项涵盖从个人开发者到Enterprise部署的各种需求,并允许免版税再分发。
对于具体使用案例的问题, IronOCR操作指南库提供了涵盖数十种场景的分步文章。 完整的 API 接口已记录在IronOCR API 参考文档中。
常见问题解答
在 C# 中实现 PDF OCR 所需的最少代码是什么?
使用IronOCR,最简代码如下:创建一个 IronTesseract 实例,创建一个 OcrInput 对象,调用 input.LoadPdf 并传入文件路径,然后调用 ocr.Read(input)。result.Text 属性返回提取的字符串。
如何在.NET项目中安装IronOCR ?
在终端中运行“dotnet add package IronOCR ”,或者在 Visual Studio 的NuGet包管理器中搜索IronOCR 。
IronOCR能否只处理 PDF 文件中的特定页面?
是的。传递一份清单
如何从扫描的PDF文件的特定区域提取文本?
将 Rectangle 对象数组传递给 LoadPdf 的 contentAreas 参数。每个矩形指定其从页面左上角开始的 X 坐标、Y 坐标、宽度和高度(以像素为单位)。
IronOCR为扫描文档提供哪些预处理过滤器?
IronOCR提供歪斜校正(校正页面旋转)、降噪(去除扫描伪影)、对比度增强、二值化和缩放调整等功能。这些功能可以串联使用,以提高低质量扫描件的识别准确率。
IronOCR是否支持受密码保护的PDF文件?
是的。请将密码字符串传递给 LoadPdf 函数的 password 参数。该库会在渲染页面以进行 OCR 识别之前解密文档。
IronOCR能否生成可搜索的PDF输出?
是的。调用 `ocr.Read(input)` 后,调用 `result.SaveAsSearchablePdf` 并指定输出文件路径。生成的 PDF 文件会保留原始扫描件作为视觉层,并在其中嵌入一个不可见的文本层,用于搜索和复制操作。
IronOCR支持哪些语言?
IronOCR支持超过 125 种语言包,涵盖拉丁文、西里尔文、中日韩文、阿拉伯文和其他文字。在调用 Read 方法之前,请设置 IronTesseract 实例的 Language 属性。
IronOCR能否读取 PDF 文档中的条形码和二维码?
是的。在调用 Read 方法之前,请将 ocr.Configuration.ReadBarCodes 设置为 true。OcrResult.Barcodes 集合包含所有检测到的条形码的解码值和格式类型。
IronOCR能在 Linux 和 Docker 容器中运行吗?
IronOCR的。IronOCR 支持部署在 Windows、Linux、macOS 以及包括 Azure 和 Docker 容器在内的云环境中。IronSoftware 文档包含针对不同环境的安装指南。

