65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.58/5 (16投票s)

2008 年 9 月 8 日

CPOL

4分钟阅读

viewsIcon

179186

downloadIcon

8183

本文将展示如何将 Office 2007 OCR 引擎集成到自定义应用程序中, 并使用 OpenXML 和语音识别

引言

有时在开发应用程序时,我们会遇到这种情况:我们有一个扫描的文档(图像),想将其转换为文本(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 和语音识别的好处相结合,就可以改进您的应用程序。

© . All rights reserved.