目录
引言
从图片或扫描的 PDF 中提取文本是许多应用程序的常见需求。光学字符识别 (OCR) 是一项使计算机能够识别此类文档并从中提取文本的技术。有了它,我们可以轻松地将图片和扫描的 PDF 转换为可编辑和可搜索的文本格式,从而更轻松地处理和分析文档内容。本博客将探讨如何使用C#和OCR库实现从图片和扫描的 PDF 中提取文本。
- C# 提取图片的文本
- C# 提取图片的文本及其坐标信息
- C# 提取扫描PDF的文本
安装C# OCR库
为了从图片中提取文本,本文将利用Spire.OCR for .NET库。Spire.OCR for .NET 是一个OCR文字识别库,专为在 .NET 应用程序中识别图片的文本而设计。它支持多种图片格式,如 BMP、JPG、PNG、TIFF 和 GIF。
以下是安装 Spire.OCR for .NET 的步骤:
- 将解决方案的平台目标更改为 x64。
- 在 NuGet 包管理器控制台中执行以下命令来从NuGet安装 Spire.OCR:
Install-Package Spire.OCR
- 打开解决方案的文件夹并进入到“packages\Spire.OCR.1.8.0\runtimes\win-x64\native”目录。将此目录下的所有DLL 文件复制并粘贴到解决方案的“Debug”文件夹中。
由于该OCR库并不支持直接处理PDF,因此要从扫描的 PDF 中提取文本,我们首先需要将 PDF 文档转换为图片。对于此任务,我们将使用Spire.PDF for .NET库。转换完成后,再利用 Spire.OCR 从生成的图片中提取文本。
你可以在 NuGet 包管理器控制台中执行以下命令来安装Spire.PDF for .NET:
Install-Package Spire.PDF
C# 提取图片的文本
Spire.OCR 提供OcrScanner.Scan()方法来识别图片中的文本。识别后,可以使用OcrScanner.Text属性获取识别的文本。
以下是使用 Spire.OCR 从图片中识别文本的主要步骤:
- 创建OcrScanner类的实例。
- 使用OcrScanner.Scan()方法识别图片中的文本。
- 使用OcrScanner.Text属性从 OcrScanner 对象获取已识别的文本。
- 将文本保存到文本文件。
以下代码示例展示了如何识别图片中的文本并将结果保存到文本文件中:
using Spire.OCR;
using System.IO;
namespace ReadTextFromImage
{
internal class Program
{
static void Main(string[] args)
{
// 指定输入图片文件的路径
string imageFilePath = "图片.png";
// 指定输出文本文件的路径
string outputFilePath = "输出.txt";
// 调用 ScanTextFromImage 方法从图片中扫描文本
string scannedText = ScanTextFromImage(imageFilePath);
// 将文本写入指定的文件
File.WriteAllText(outputFilePath, scannedText);
}
public static string ScanTextFromImage(string imageFilePath)
{
// 实例化 OcrScanner 对象
using (OcrScanner ocrScanner = new OcrScanner())
{
// 从图片中扫描文本
ocrScanner.Scan(imageFilePath);
// 从 OcrScanner 对象中获取识别到的文本
IOCRText text = ocrScanner.Text;
// 返回文本
return text.ToString();
}
}
}
}
原始图片和识别结果:
C# 提取图片的文本及其坐标信息
当需要识别图片中特定文本元素的确切位置时,提取坐标非常有用。Spire.OCR可以按行检索已识别的文本。对于每一行,可以获取其详细位置信息,包括 x 和 y 坐标以及宽度和高度。
以下是使用 Spire.OCR 从图片中提取文本及其位置信息的主要步骤:
- 创建OcrScanner类的实例。
- 使用OcrScanner.Scan()方法识别图片中的文本。
- 使用OcrScanner.Text属性从 OcrScanner 对象获取已识别的文本。
- 遍历文本中的行。
- 对于每一行,使用IOCRTextBlock.Text和IOCRTextBlock.Box属性获取其文本和位置信息,然后将结果保存到一个列表。
- 将列表内容保存到文本文件。
以下代码示例展示了如何从图片中识别文本及其位置信息并将结果保存到文本文件中:
using Spire.OCR;
using System.Collections.Generic;
using System.IO;
namespace ReadTextFromImageWithCoordinates
{
internal class Program
{
static void Main(string[] args)
{
// 指定输入图片文件的路径
string imagePath = "图片.png";
// 指定输出文本文件的路径
string outputFile = "输出.txt";
// 调用 ScanTextFromImageWithCoordinates 方法从图片中提取文本及其位置信息
List<string> extractedText = ScanTextFromImageWithCoordinates(imagePath);
// 将结果写入指定的文件
File.WriteAllLines(outputFile, extractedText);
}
// 从图片中提取文本块及其位置信息(x、y、宽度、高度)
public static List<string> ScanTextFromImageWithCoordinates(string imageFilePath)
{
// 创建一个列表
List<string> extractedText = new List<string>();
// 实例化 OcrScanner 对象
using (OcrScanner ocrScanner = new OcrScanner())
{
// 从图片中扫描文本
ocrScanner.Scan(imageFilePath);
// 获取扫描到的文本
IOCRText text = ocrScanner.Text;
// 遍历每个文本块
foreach (IOCRTextBlock block in text.Blocks)
{
// 将每个文本块的文本和位置信息添加到列表中
extractedText.Add($"文本: {block.Text}\n位置: {block.Box}");
}
}
return extractedText;
}
}
}
C# 提取扫描PDF的文本
从扫描的 PDF 中提取文本需要两个步骤。首先,使用 Spire.PDF 将扫描的 PDF 转换为图片,然后利用 Spire.OCR 从这些图片中提取文本。
以下是使用 Spire.PDF 和 Spire.OCR 识别扫描 PDF 中的文本的主要步骤:
- 创建PdfDocument类的实例。
- 使用PdfDocument.LoadFromFile()方法加载 PDF 文档。
- 遍历 PDF 文档的页面。
- 使用PdfDocument.SaveAsImage()方法将每个页面转换为 Image 对象。
- 使用Image.Save()方法将 Image 对象保存到流中。
- 创建OcrScanner类的实例。
- 使用OcrScanner.Scan()方法识别流中的文本。
- 使用IOCRText.Text属性获取识别的文本并将其附加到字符串列表中。
- 将列表内容保存到文本文件。
以下代码示例展示了如何识别扫描 PDF 中的文本并将结果保存到文本文件:
using Spire.OCR;
using Spire.Pdf;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
namespace ReadTextFromScannedPDF
{
internal class Program
{
static void Main(string[] args)
{
// 指定扫描的 PDF 文件路径
string pdfFilePath = "测试.pdf";
// 指定输出文本文件的路径
string outputFilePath = "输出.txt";
// 从扫描的 PDF 中提取文本
List<string> extractedText = ExtractTextFromScannedPDF(pdfFilePath);
// 将文本写入指定的文件
File.WriteAllLines(outputFilePath, extractedText);
}
// 从扫描的 PDF 中提取文本
public static List<string> ExtractTextFromScannedPDF(string pdfFilePath)
{
// 创建一个列表来存储提取的文本
List<string> extractedText = new List<string>();
// 创建 PdfDocument 类的实例
using (PdfDocument document = new PdfDocument())
{
// 加载 PDF 文档
document.LoadFromFile(pdfFilePath);
// 遍历文档中的每一页
for (int pageIndex = 0; pageIndex < document.Pages.Count; pageIndex++)
{
// 将页面转换为图片
using (Image image = document.SaveAsImage(pageIndex, 300, 300))
{
// 创建流来保存图片数据
using (MemoryStream stream = new MemoryStream())
{
// 将图片以 PNG 格式保存到流中
image.Save(stream, ImageFormat.Png);
stream.Position = 0;
// 从流中扫描文本并将其添加到列表中
string text = ScanTextFromImageStream(stream);
extractedText.Add(text);
}
}
}
}
// 返回列表
return extractedText;
}
// 从流中扫描文本
public static string ScanTextFromImageStream(Stream stream)
{
// 创建 OcrScanner 类的实例
using (OcrScanner ocrScanner = new OcrScanner())
{
// 从流中扫描文本
ocrScanner.Scan(stream, OCRImageFormat.Png);
IOCRText text = ocrScanner.Text;
// 返回文本
return text.ToString();
}
}
}
}
注意事项
OCR的准确性很大程度上受到图片质量的影响。使用清晰、对比度良好,不模糊、倾斜的图片,可以提高识别结果的准确性。不同OCR库可能对不同语言和字体的支持程度不同,一些特定语言或字体可能识别效果较差。因此在识别完成后,最好再人工校正一遍。
本文完结。