是否有API使用Onenote OCR功能自动识别图像中的文本?
答案 0 :(得分:5)
如果您的程序将在同一台计算机上安装OneNote客户端,则可以在OneNote中创建页面并通过COM API插入图像。然后,您可以读取XML格式的页面,其中包括OCR的文本。
您想要使用
Application.CreateNewPage
创建页面Application.UpdatePageContent
插入图片Application.GetPageContent
阅读网页内容并在XML中查找OCRData
和OCRText
元素。此处记录了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
- 詹姆斯
答案 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?。这正是我所做的:
挑战包括我决定使用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崩溃。