桌面软件中的Onenote OCR功能

时间:2014-08-12 12:24:03

标签: c# ocr onenote

是否有API使用Onenote OCR功能自动识别图像中的文本?

5 个答案:

答案 0 :(得分:5)

如果您的程序将在同一台计算机上安装OneNote客户端,则可以在OneNote中创建页面并通过COM API插入图像。然后,您可以读取XML格式的页面,其中包括OCR的文本。

您想要使用

  1. Application.CreateNewPage创建页面
  2. Application.UpdatePageContent插入图片
  3. Application.GetPageContent阅读网页内容并在XML中查找OCRDataOCRText元素。
  4. 此处记录了OneNote COM API:http://msdn.microsoft.com/en-us/library/office/jj680120(v=office.15).aspx

答案 1 :(得分:2)

当您通过API在OneNote中的页面上放置图像时,任何图像都将自动成为OCR' d。然后,用户将能够在OneNote中搜索图像中的任何文本。但是,您无法将图像拉回来并在此时读取OCR文本。

如果这是您感兴趣的功能,我邀请您访问我们的UserVoice网站并提交此提示:http://onenote.uservoice.com/forums/245490-onenote-developers

更新:对该提示进行投票:https://onenote.uservoice.com/forums/245490-onenote-developer-apis/suggestions/10671321-make-ocr-available-in-the-c-api

- 詹姆斯

答案 2 :(得分:1)

这里有一个非常好的示例: http://www.journeyofcode.com/free-easy-ocr-c-using-onenote/

代码的主要部分是:

private string RecognizeIntern(Image image)
{
    this._page.Reload();

    this._page.Clear();
    this._page.AddImage(image);

    this._page.Save();

    int total = 0;
    do
    {
        Thread.Sleep(PollInterval);

        this._page.Reload();

        string result = this._page.ReadOcrText();
        if (result != null)
            return result;
    } while (total++ < PollAttempts);

    return null;
}

答案 3 :(得分:0)

不确定OCR,但onenote API的文档站点是这个

http://msdn.microsoft.com/en-us/library/office/dn575425.aspx#sectionSection1

答案 4 :(得分:0)

由于我将删除我的博客(在另一篇文章中已提到),我认为我应该在此处添加内容以供将来参考:

用法

让我们首先看一下如何使用该组件: OnenoteOcrEngine 类实现核心功能,并实现提供单个方法的接口 IOcrEngine

public interface IOcrEngine
{
    string Recognize(Image image);
}

不包括任何错误处理,可以按以下类似的方式使用它:

using (var ocrEngine = new OnenoteOcrEngine())
using (var image = Image.FromFile(imagePath))
{
    var text = ocrEngine.Recognize(image);
    if (text == null)
        Console.WriteLine("nothing recognized");
    else
        Console.WriteLine("Recognized: " + text);
}

实施

实现远不那么直接。在Office 2010之前,Microsoft Office Document Imaging (MODI)可用于OCR。不幸的是,情况不再如此。进一步的研究证实,OneNote的OCR功能没有直接以API形式公开,但是提出了一些建议,以手动解析文本的OneNote文档(请参阅Is it possible to do OCR on a Tiff image using the OneNote interop API?need a document to extract text from image using onenote Interop?。这正是我所做的:

  1. 使用COM interop
  2. 连接到OneNote
  3. 创建一个包含要处理的图像的临时页面
  4. 显示临时页面(这很重要,因为OneNote否则将不执行OCR)
  5. OCRData 标记进行轮询,该标记在页面的XML代码中包含 OCRText 标记。
  6. 删除临时页面

挑战包括我决定使用LINQ to XML的XML代码的解析。例如,插入图像是使用以下代码完成的:

private XElement CreateImageTag(Image image)
{
    var img = new XElement(XName.Get("Image", OneNoteNamespace));

    var data = new XElement(XName.Get("Data", OneNoteNamespace));
    data.Value = this.ToBase64(image);
    img.Add(data);

    return img;
}

private string ToBase64(Image image)
{
    using (var memoryStream = new MemoryStream())
    {
        image.Save(memoryStream, ImageFormat.Png);

        var binary = memoryStream.ToArray();
        return Convert.ToBase64String(binary);
    }
}

请注意使用XName.Get("Image", OneNoteNamespace)(其中OneNoteNamespace是常量“ http://schemas.microsoft.com/office/onenote/2013/onenote”)来创建具有正确名称空间的元素,以及使用ToBase64方法将GDI图像从内存序列化到{{ 3}}。不幸的是,必须结合轮询(请参见Base64 format进行有关主题的讨论)和超时来确定检测过程是否成功完成:

int total = 0;
do
{
    Thread.Sleep(PollInterval);

    this._page.Reload();

    string result = this._page.ReadOcrText();
    if (result != null)
        return result;
} while (total++ < PollAttempts);

结果

结果并不完美。但是,考虑到图像的质量,我认为它们令人满意。我可以在项目中成功使用该组件。一个令人烦恼的问题仍然存在:有时,OneNote在此过程中崩溃。在大多数情况下,只需重新启动即可解决此问题,但是尝试从某些图像中识别文本会导致OneNote崩溃。

代码/下载

What is wrong with polling?上查看代码