Возможности Onenote OCR в программном обеспечении для настольных ПК

Существует ли API для использования возможностей OCR Onenote для автоматического распознавания текста на изображениях?


person Salah Alshaal    schedule 12.08.2014    source источник
comment
В частности, я говорю об OneNote 2013.   -  person Salah Alshaal    schedule 12.08.2014


Ответы (5)


Если у вас есть клиент OneNote на том же компьютере, на котором будет выполняться ваша программа, вы можете создать страницу в OneNote и вставить изображение через COM API. Затем вы можете прочитать страницу в формате XML, которая будет включать в себя текст, обработанный OCR.

Вы хотите использовать

  1. Application.CreateNewPage для создания страницы
  2. Application.UpdatePageContent чтобы вставить изображение
  3. Application.GetPageContent для чтения содержимого страницы и поиска элементов OCRData и OCRText в XML.

API OneNote COM задокументирован здесь: http://msdn.microsoft.com/en-us/library/office/jj680120(v=office.15).aspx

person Omer Atay - MSFT    schedule 10.10.2014
comment
извините, есть ли способ использовать это в powershell? - person Heber Solis; 02.10.2020

Когда вы помещаете изображение на страницу в OneNote через API, любые изображения автоматически распознаются. Затем пользователь сможет искать любой текст на изображениях в 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

-- Джеймс

person JamesLau-MSFT    schedule 12.08.2014

Вот действительно хороший пример того, как это сделать: 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;
}
person DermFrench    schedule 15.06.2015

не уверен насчет OCR, но сайт документации для onenote API это

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

person Luis Valencia    schedule 12.08.2014
comment
Спасибо, я нашел эту страницу, но OCR на самом деле не упоминается в вызовах API. - person Salah Alshaal; 12.08.2014

Поскольку я буду удалять свой блог (который упоминался в другом посте), я подумал, что должен добавить сюда контент для дальнейшего использования:

Применение

Начнем с того, как использовать компонент: класс 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. К сожалению, это уже не так. Дальнейшие исследования подтвердили, что функция OCR OneNote не представлена ​​напрямую в виде API, но были сделаны предложения вручную анализировать документы OneNote на наличие текста (см. Можно ли выполнять распознавание текста в формате Tiff с помощью API взаимодействия OneNote? или нужен документ для извлечения текста из изображения с помощью onenote Interop? , И это именно то, что я сделал:

  1. Подключитесь к OneNote с помощью COM-взаимодействия.
  2. Создайте временную страницу, содержащую изображение для обработки
  3. Показать временную страницу (важно, поскольку в противном случае OneNote не будет выполнять распознавание символов)
  4. Опрос тега OCRData, содержащего тег OCRText в XML-коде страницы.
  5. Удалить временную страницу

Проблемы включали разбор кода XML, для которого я решил использовать LINQ to 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-образ из памяти в Формат Base64. К сожалению, опрос (см. Что не так с опросом? для обсуждение темы) в сочетании с тайм-аутом необходим для определения того, успешно ли завершился процесс обнаружения:

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.

Код / Скачать

Ознакомьтесь с кодом на GitHub.

person Matthias    schedule 13.05.2020