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

使用 LEADTOOLS SDK 进行图像 OCR 和文档转换

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2016年4月1日

CPOL

9分钟阅读

viewsIcon

25543

我在评估LEADTOOLS SDK时要解决的问题是,使用手机拍摄的纸质文本页面照片,对其进行处理并在文档查看器中显示,然后将其转换为Word格式,以便于编辑。

LEADTOOLS 是 LEAD Technologies, Inc. 的产品。该公司自1990年成立以来,一直是OCR和成像行业的先驱。凭借其悠久的历史,LEADTOOLS产品套件包含了我所见过的最全面的成像套件。其功能(此处无法一一列举)包括OCR(光学字符识别)、ICR(智能字符识别——用于手写字符)、文档成像(包括医疗)、图像处理(具有多种效果!)以及文档转换(转换为PDF、docx等)。

在本文中,我将重点关注文档查看文档转换。我在评估LEADTOOLS SDK时要解决的问题是,使用手机拍摄的纸质文本页面照片,对其进行处理并在文档查看器中显示,然后将其转换为Word格式,以便于编辑。当只有文档的纸质副本可用,而需要数字格式时,这将非常有用。

获取软件

LEADTOOLS SDK支持多种平台,包括.NET、C(Windows)、Linux、iOS、OS X、Android和HTML5(JavaScript)。在本文中,我们将使用.NET SDK和Visual Studio 2015。您需要下载并安装功能齐全的SDK评估版。该评估版有效期为60天。

作为评估的一部分,您将收到一封电子邮件,其中包含一个zip文件链接,该文件包含您的评估许可证文件和密钥。这是评估该产品套件的一个非常重要的步骤!我将很快概述如何使用这些文件。

入门

鉴于SDK中提供了广泛的功能,初次接触时感到不知所措是很正常的。请放心,实际上,使用LEADTOOLS SDK非常容易入门。这是因为有丰富的文档、演示(附带源代码)、视频和教程可帮助您快速上手。事实上,在文档查看器功能网站页面上很容易找到实现第一个文档查看器的示例源代码。请注意,如果您希望使用文档查看器,仅支持Windows Forms和HTML5/JavaScript。本文将实现一个Windows Forms解决方案。

创建项目

在Visual Studio 2015中,创建一个新的C# Windows Forms应用程序。我将我的项目命名为LeadToolsPhotoTextRecognition。

项目加载后,请添加对LeadTools.dll的引用(在本例中,它位于安装目录:C:\LEADTOOLS 19\bin\DotNet4\x64)。

接下来,我们将添加一些代码来设置许可证。在您的解决方案中创建一个名为license的新文件夹。然后右键单击该文件夹,选择“添加现有项”。选择您从评估电子邮件中获得的许可证文件和密钥文件。请确保将这些文件的“复制到输出目录”属性设置为“始终”。

Form1的代码隐藏文件中。在文件顶部添加以下using语句

using Leadtools;
using System.IO;

然后,将以下方法添加到Form1类中以初始化您的应用程序许可证

protected override void OnLoad(EventArgs e)
{
    try
    {
        SetLicense();
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    base.OnLoad(e);
}

private void SetLicense()
{
    RasterSupport.SetLicense(Application.StartupPath +@"\license\eval-license-files.lic", 
        File.ReadAllText(Application.StartupPath +@"\license\eval-license-files.lic.key").Trim());
}

布局用户界面

Form1的设计器中,添加一个菜单栏(我添加了一个“文件”顶级菜单项,其中包含一个“打开”子菜单项)。在窗体的其余部分添加一个SplitContainer控件。这些面板将用于容纳文档查看器的组件。

实现文档查看器

要使用DocumentViewer,请添加以下引用

  • Leadtools.Documents.dll
  • Leadtools.Documents.Pdf.dll
  • Leadtools.Documents.Raster.dll
  • Leadtools.Documents.UI.WinForms.dll

接下来,在Form1的代码隐藏文件中,添加以下using语句

using Leadtools.Documents.UI;

然后将以下方法添加到Form1类中

DocumentViewer _documentViewer = null;

private void InitDocumentViewer()
{
    // Create the document viewer using panels of a System.Windows.Forms.SplitterPanel
    var createOptions = new Leadtools.Documents.UI.DocumentViewerCreateOptions();
    createOptions.ViewContainer = this.splitContainer1.Panel2;
    createOptions.ThumbnailsContainer = this.splitContainer1.Panel1;
    _documentViewer = DocumentViewerFactory.CreateDocumentViewer(createOptions);
    _documentViewer.View.PreferredItemType = DocumentViewerItemType.Svg;
    _documentViewer.Commands.Run(DocumentViewerCommands.InteractivePanZoom);
}

从这段代码中可以看到,DocumentViewer本身并不是一个控件。它通过将不同的视图分配给应用程序中的现有容器来创建,在本例中是SplitContainer中的面板。您可以在此网页上查找有关DocumentViewer可用元素的更多信息。

现在,我们需要在OnLoad方法中调用InitDocumentViewer方法,紧跟在SetLicense方法调用之后。

InitDocumentViewer();

如果您现在运行应用程序,似乎不会发生太多事情。我们现在就来改变这一点!

将文件加载到文档查看器

由于我们将使用手机拍摄的JPG照片,因此我们需要添加以下CODEC引用

  • Leadtools.Codecs.dll
  • Leadtools.Codecs.Cmp.dll
  • Leadtools.Codecs.Tif.dll

现在让我们实现菜单中的“打开”功能。双击Form1设计器中的“打开”菜单项。这将允许我们实现选择一个文件在DocumentViewer中打开。要开始,请向您的代码文件添加以下using语句

using Leadtools.Documents;
using Leadtools.Documents.UI;
using System.IO;

然后,按如下方式实现菜单项单击处理程序

private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
    OpenFileDialog fileDialog = new OpenFileDialog();
    fileDialog.InitialDirectory = "c:\\";
    fileDialog.Filter = "jpg files (*.jpg)|*.jpg|All files (*.*)|*.*";
    fileDialog.RestoreDirectory = true;

    if (fileDialog.ShowDialog() == DialogResult.OK)
    {
        LoadDocument(fileDialog.FileName);

    }
}

最后,我们将实现Form1类中的LoadDocument方法

private void LoadDocument(string path)
{
    var document = DocumentFactory.LoadFromFile(
            path,
            new LoadDocumentOptions { UseCache = false });
    // Set in the viewer
    _documentViewer.SetDocument(document);
}

现在您可以运行应用程序并打开一个文档以加载到DocumentViewer中。请注意,虽然本示例中使用的是jpg图像,但您并不局限于此文件类型。您可以随意尝试打开Word文件、PDF文件等,只需确保添加相应的Leadtools.Codecs.***引用,其中***通常是文件扩展名。 这里有一页文档,其中准确说明了每种文件类型所需的DLL。

对照片执行光学字符识别

文档查看器具有许多内置命令,允许您执行许多常见任务。其中一个命令是Text.Get命令。此命令将对加载在查看器中的文档执行OCR。执行此命令后,文本将被解析并可用于其他功能,例如文本选择和文档转换。

让我们设置OCR引擎。添加以下引用

  • Leadtools.Forms.DocumentWriters
  • Leadtools.Forms.Ocr
  • Leadtools.Forms.Ocr.Advantage

Form1.cs文件中添加以下using语句

using Leadtools.Forms.Ocr;

然后将以下代码添加到Form1类中以初始化OCR引擎

private IOcrEngine _ocrEngine = null;
private void InitOcrEngine()
{
    try
    {
        _ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.Advantage, false);
        _ocrEngine.Startup(null, null, null, null);
    }
    catch (Exception ex)
    {
        MessageBox.Show(string.Format("Failed to start the Advantage OCR engine.",            ex.Message));
    }
}

在类的OnLoad方法中,在InitDocumentViewer()函数调用之后立即添加对InitOcrEngine()的调用。

最后,我们需要将OCR引擎分配给正在查看器中加载的文档。在LoadDocument方法中,在SetDocument调用之前直接添加以下代码

document.Text.OcrEngine = _ocrEngine;

现在,让我们在Form1设计器的菜单中实现一个新的菜单项,该菜单项将对图像执行OCR,添加一个**获取文本**菜单项。

双击“获取文本”菜单项,按如下方式实现其功能

private void getTextToolStripMenuItem_Click(object sender, EventArgs e)
{
    var thisOperation = new DocumentViewerAsyncOperation
    {
        Error = (DocumentViewerAsyncOperation operation, Exception error) =>
        {
            MessageBox.Show(error.Message);
        },
        Always = (DocumentViewerAsyncOperation operation) =>
        {
            MessageBox.Show("DONE!");
        }
    };

    _documentViewer.Commands.RunAsync(thisOperation, DocumentViewerCommands.TextGet, _documentViewer.CurrentPageNumber);
}

此代码启动一个异步调用,让文档查看器获取查看器中加载的文档当前页面的文本(在本例中,我们的文档是单个图像,被视为单页)。这反过来将调用分配给文档的OCR引擎。完成后,将显示一个显示“DONE!”的message box。

选择和复制文本

既然我们已经能够从图像中获取文本,我们现在可以进行文本选择,并将其复制到剪贴板,以便您将其粘贴到其他应用程序中。为此,请创建两个新的菜单项:选择文本和复制文本。

双击这两个新菜单项中的每一个,并在代码隐藏文件中按如下方式实现它们

private void selectTextToolStripMenuItem_Click(object sender, EventArgs e)
{
            
    _documentViewer.Commands.Run(DocumentViewerCommands.InteractiveSelectText);
}

private void copyTextToolStripMenuItem_Click(object sender, EventArgs e)
{
    _documentViewer.Commands.Run(DocumentViewerCommands.TextCopy);
}

“选择文本”将文档查看器置于交互模式,允许用户突出显示文本。能够直接在图像上选择文本非常棒!当您再次运行应用程序时,请务必在尝试选择文本之前进行“获取文本”。如果将在InitDocumentViewer()方法中将文档查看器的AutoGetText属性设置为true,则可以绕过此步骤。通过设置此属性,文档查看器将在文本可选择之前发出“获取文本”命令(如果尚未执行)。

_documentViewer.Text.AutoGetText = true;

再次运行应用程序,选择“获取文本”菜单项,然后选择“选择文本”菜单项。您现在可以在文档上选择文本。一旦文本被高亮显示,选择“复制文本”命令,然后打开记事本并粘贴生成的文本。

将图像文档保存为Microsoft Word文件

我在这个探索性项目中要做的最后一件事是将生成的文档保存为Word文件。OCR引擎在任何转换之前会将内容分解为SVG中间层。这一点很棒,因为它在可能的情况下还会匹配字体。

要实现文档转换为Word,请添加对以下程序集的引用

  • Leadtools.Codecs.Dox
  • Leadtools.Documents.Converters

接下来,在窗体中添加另一个菜单项,命名为“保存”。

按如下方式实现“保存”菜单项

private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
    var converter = new DocumentConverter();
    converter.SetOcrEngineInstance(_ocrEngine, false);
           
    var jobData = new DocumentConverterJobData() {
        Document = _documentViewer.Document,
        DocumentFormat = Leadtools.Forms.DocumentWriters.DocumentFormat.Docx,
        JobName = "SaveToDocx",
        OutputDocumentFileName = "sample.docx"
    };

    var job = converter.Jobs.CreateJob(jobData);

    converter.Jobs.RunJob(job);

    if(job.Status== DocumentConverterJobStatus.Success)
    {
        MessageBox.Show("Word Document Created");
    } else
    {
        MessageBox.Show("Word Document Creation Failed");
    }
}

此代码实例化一个文档转换器,分配OCR引擎,并创建一个作业将文档查看器中加载的文档转换为Microsoft Word(docx)格式,并将其保存为文件名sample.docx。由于我们将初始化的OCR引擎分配给了文档转换器,因此在保存文档之前不需要执行“获取文本”。当您运行应用程序并加载图像后,只需单击“保存”菜单项即可创建文件。

您不仅可以将图像转换为Microsoft Word格式。文档转换器支持多种不同的文件类型

结论

本文仅涵盖了LEADTOOLS SDK的一小部分。我成功地实现了一个解决方案来解决本文开头提出的问题。我对SDK的体验是积极的。由于其庞大的规模,初次接触时确实会让人不知所措。好在评估版安装了演示的完整源代码,并且有一个响应迅速的开发者支持系统(可通过在线论坛和电子邮件获得),这减轻了这种感觉。我发现弄清楚不同功能需要哪些引用有点棘手,但通过LEADTOOLS的支持以及反复试验,我克服了这些问题。我也有点惊讶的是,WPF不支持文档查看器,但另一方面,我很高兴它在JavaScript/HTML5中可用。

总的来说,我对LEADTOOLS SDK非常满意,并推荐它用于您可能遇到的任何OCR或成像需求。

源代码下载

© . All rights reserved.