Существует ли API для использования возможностей OCR Onenote для автоматического распознавания текста на изображениях?
Возможности Onenote OCR в программном обеспечении для настольных ПК
Ответы (5)
Если у вас есть клиент OneNote на том же компьютере, на котором будет выполняться ваша программа, вы можете создать страницу в OneNote и вставить изображение через COM API. Затем вы можете прочитать страницу в формате XML, которая будет включать в себя текст, обработанный OCR.
Вы хотите использовать
Application.CreateNewPage
для создания страницыApplication.UpdatePageContent
чтобы вставить изображениеApplication.GetPageContent
для чтения содержимого страницы и поиска элементовOCRData
иOCRText
в XML.
API OneNote COM задокументирован здесь: http://msdn.microsoft.com/en-us/library/office/jj680120(v=office.15).aspx
Когда вы помещаете изображение на страницу в 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
-- Джеймс
Вот действительно хороший пример того, как это сделать: 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;
}
не уверен насчет OCR, но сайт документации для onenote API это
http://msdn.microsoft.com/en-us/library/office/dn575425.aspx#sectionSection1
Поскольку я буду удалять свой блог (который упоминался в другом посте), я подумал, что должен добавить сюда контент для дальнейшего использования:
Применение
Начнем с того, как использовать компонент: класс 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? , И это именно то, что я сделал:
- Подключитесь к OneNote с помощью COM-взаимодействия.
- Создайте временную страницу, содержащую изображение для обработки
- Показать временную страницу (важно, поскольку в противном случае OneNote не будет выполнять распознавание символов)
- Опрос тега OCRData, содержащего тег OCRText в XML-коде страницы.
- Удалить временную страницу
Проблемы включали разбор кода 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.