使用 Office 2007 OCR、OpenXML 和语音识别转换图像到文本






4.58/5 (16投票s)
本文将展示如何将 Office 2007 OCR 引擎集成到自定义应用程序中,
引言
有时在开发应用程序时,我们会遇到这种情况:我们有一个扫描的文档(图像),想将其转换为文本(Word 2007 文档)。一些扫描仪提供可以自动执行此类转换的应用程序,但大多数情况下,生成的文档格式是*.pdf或*.odt等。如果您想直接转换为*.docx(OpenXML)文档,则需要使用第三方应用程序或从头开始开发。
OpenXML 已成为 ISO 标准(IS29500),其采用率随着其性能、可扩展性和安全性而日益增长。该格式是 Microsoft Office 2007 文档(*.pptx、*.docx、*.xlsx)的默认格式。它比二进制文档小 75%,并且基于两项主要技术:ZIP 和 XML。
语音识别是 .NET Framework 3.5 中包含的一项功能。开发人员可以使用此 API 提供更好的用户体验、轻松访问特定信息等。该 API 自 .NET Framework 3.0 起可用,并且是 Windows Vista 的默认功能。
场景
为了方便开发人员的工作并避免与第三方应用程序集成,Microsoft 在 Office 2007 中发布了一个名为 MODI(Microsoft Office Document Imaging)的 OCR(光学字符识别)API。需要记住的是,本示例中使用的 API 仅限于 Office 2007(Office 2003 有其自己的 OCR API)。
在本文中,我们将创建一个使用 Office 2007 OCR API 生成 OpenXML 文档的 Windows 应用程序。此外,我们将使用语音识别 API 来改善应用程序的用户体验。
在开始之前,您需要已安装以下要求:
- Visual Studio 2008
- .NET Framework 3.5
- OpenXML SDK 1.0
- Office 2007
需要安装 Microsoft Office Document Imaging 12.0 类型库。Office 2007 安装程序默认不安装此组件,需要稍后安装。为此:
- 运行 Office 2007 安装程序
- 单击“添加或删除功能”按钮
- 确保已安装该组件
使用 MODI
要使用 Office 2007 OCR API,您必须添加对 Microsoft Office Document Imaging 12.0 类型库的引用。为此:
- 在“解决方案资源管理器”中,选择“添加引用”
- 在“COM”选项卡中,选择“Microsoft Office Document Imaging 12.0 类型库”
创建 MODI 对象
/// <summary>
/// Document Imaging Library
/// </summary>
MODI.Document md;
在 Form
类的构造函数中,实例化 MODI 对象
public Form1()
{
InitializeComponent();
speaker.Rate = -2;
speaker.Volume = 100;
ListFiles = new List<string>();
md = new MODI.Document();
}
之后,您只需实现转换方法。让我们看看如何做到这一点:
private void OCRImplementation()
{
Cursor = Cursors.WaitCursor;
foreach (string Name in checkedListBox1.CheckedItems)
{
try
{
md.Create(Name);
md.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
string strText = String.Empty;
MODI.Image image = (MODI.Image)md.Images[0];
MODI.Layout layout = image.Layout;
for (int i = 0; i < layout.Words.Count; i++)
{
MODI.Word word = (MODI.Word)layout.Words[i];
if (strText.Length > 0)
{
strText += " ";
}
strText += word.Text;
}
md.Close(false);
CreateDocument(strText);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
Cursor = Cursors.Default;
}
}
}
OCRImplementation
方法将转换图像文件(*.tif、*.jpg、*.gif、*.bmp,在本例中我们使用 TIFF 文件)。md
对象的 Create
方法接收要转换的文件路径。OCR
方法接收三个参数:第一个参数表示文档的语言,第二个参数指定 OCR 引擎是否尝试确定页面的方向,第三个参数指定 OCR 引擎是否尝试修复与垂直方向的轻微倾斜。
要检索文本,需要添加对 Image
和 Layout
对象属性的引用。Layout
对象允许文本检索。该对象的 Words
属性包含 Count
属性,该属性允许遍历单词列表。您可以使用索引器检索单词,而不是在单词之间添加空格。
md
对象的 Close
方法接受一个布尔参数,指示是否将更改保存到图像文件。
使用 OpenXML SDK
在“解决方案资源管理器”中,添加对 DocumentFormat.OpenXML
库的引用。该库允许将转换后的文本转换为 Word 文档。有一个常量对象将处理文档的结构和关系(它将定义标记,在本例中为 WordprocessingML
)。
private const string PART_TEMPLATE =
"<?xml version='1.0' encoding='UTF-8' standalone='yes'?>" +
"<w:document xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main'>" +
"<w:body><w:p><w:r><w:t>#REPLACE#</w:t></w:r></w:p></w:body></w:document>";
CreateDocument
方法负责将文本插入到文档结构中。
private void CreateDocument(string Text)
{
WordprocessingDocument wordDoc =
WordprocessingDocument.Create(txt_SavePath.Text,
WordprocessingDocumentType.Document);
MainDocumentPart docPart = wordDoc.MainDocumentPart;
string partML;
docPart = wordDoc.AddMainDocumentPart();
partML = PART_TEMPLATE.Replace("#REPLACE#", Text);
Stream partStream = docPart.GetStream();
UTF8Encoding encoder = new UTF8Encoding();
Byte[] buffer = encoder.GetBytes(partML);
partStream.Write(buffer, 0, buffer.Length);
wordDoc.Close();
}
语音识别
/// <summary>
/// synthesis speech
/// </summary>
SpeechSynthesizer speaker = new SpeechSynthesizer();
在 .NET 选项卡中添加对 System.Speech
的引用。之后,您只需调整 Volume
和 Rate
属性,并使用 Speak
方法说出 string
。
speaker.Speak("Searching");
结论
结合这些强大的 API 是一个有趣的想法,与第三方 API 相比,OCR 实现的代码非常简短。它是一个可以从多种方式进行探索的工具,如果与 OpenXML 和语音识别的好处相结合,就可以改进您的应用程序。