SharePoint 2010 com OCR (Optical Character Recognition) 

Tags: Developers

Neste artigo vou abordar uma forma simples de obter imagens do SharePoint e processar o seu OCR usando o Tessnet2 .NET 2.0 OCR Assembly.

 

OCR é um acrónimo para o inglês Optical Character Recognition, uma tecnologia para reconhecer caracteres a partir de um arquivo de imagem, ou mapa de bits. Através do OCR é possível digitalizar uma folha de texto impresso e obter um arquivo de texto editável.

 

O Tessnet2 necessita de uma pasta que podem obter no link do produto e que basicamente vai ter o Core mais as Bibliotecas de Processamento, neste caso tenho Inglês e Português. Também temos de adicionar o DLL para 64 Bits ao projeto, visto que estou a utilizar SharePoint 2010

 

 

Na primeira parte deste artigo irei processar uma Lista SharePoint de Documentos e irei coloca-las no Disco Rígido, numa diretoria “c:\temp\images”

 

O Processo SharePoint

 

Chamo a atenção de estar a processar a informação logo a seguir ao foreach mas se queremos controlar se o documento está Online ou não vamos ter que utilizar o switch incluído no procedimento.

 

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;
using System.IO;

try
{
    string ImagePath = @"c:\temp\images\";
      
   
SPSite mysite = new SPSite(“SPSite”);
   
SPWeb myweb = mysite.OpenWeb();
   
SPFolder mylibrary = myweb.Folders[“SPList”];
   
SPFileCollection files = mylibrary.Files;
   
foreach (SPFile item in files)
   
{
       
byte[] binfile2 = item.OpenBinary();
       
FileStream fstream = new FileStream(ImagePath + item.Name,
                   
FileMode.Create,
                       
FileAccess.ReadWrite);
       
fstream.Write(binfile2, 0, binfile2.Length);
       
fstream.Close();  

       
switch (item.CheckOutType)
       
{
           
case SPFile.SPCheckOutType.None:                              
               
break;

           
case SPFile.SPCheckOutType.Offline:
               
break;
           
case SPFile.SPCheckOutType.Online:                            
               
break;

           
default:
               
break;
       
}
   
}
}
catch (Exception ex)
{
   
//Whatever;
}
 
 

Método geral para processamento OCR

 

Estou a utilizar um método que retorna um StringBuilder  pois é muito mais rápido que um Array[] de Strings e a passar o caminho para a imagem.

 

O Método retira palavra a palavra que adiciono ao StringBuilder  mais um “Espaço”

O Método RemoveDiacriticals retira algum lixo (diacríticos) do OCR, passando alguns caracteres que queremos excluir

 

private StringBuilder ProcessOcr(string imagePath)
{
   
StringBuilder sb = new StringBuilder();
   
using (Bitmap image = new Bitmap(imagePath))
   
{
       
using (tessnet2.Tesseract tessocr = new tessnet2.Tesseract())
       
{
           
tessocr.Init(@"c:\temp\tessdata", "por", false);

           
List<tessnet2.Word> result = tessocr.DoOCR(image, Rectangle.Empty);
           
foreach (tessnet2.Word word in result)
           
{
               
sb.Append(RemoveDiacriticals(word.Text) + " ");
           
}
           
return sb;
       
}
   
}
}

 

private string RemoveDiacriticals(string txt)
{
   
string nfd = txt.Normalize(NormalizationForm.FormD);
   
StringBuilder retval = new StringBuilder(nfd.Length);
   
foreach (char ch in nfd)
   
{
       
if (ch >= '\u0300' && ch <= '\u036f') continue;
       
if (ch >= '\u1dc0' && ch <= '\u1de6') continue;
       
if (ch >= '\ufe20' && ch <= '\ufe26') continue;
       
if (ch >= '\u20d0' && ch <= '\u20f0') continue;
       
retval.Append(ch);
   
}
   
return retval.ToString();
}
 

Vou à diretoria onde coloquei a as imagens retiradas do SharePoint, neste exemplo só estou a processar .jpg e retirar o texto OCR do tipo “bem vindos à comunidade SharePoint.org”

 

private string VamosNessa()
{
   
DirectoryInfo di = new DirectoryInfo(ImagePath);
   
FileInfo[] rgFiles = di.GetFiles("*.jpg");
    foreach (FileInfo fi in rgFiles)
   
{
              GC.Collect();
       
return ProcessOcr(fi.FullName).ToString();
       
       
   
}
}

  

Se queremos fazer o upload do OCR para um campo numa lista temos de saber qual o seu caminho SharePoint, podemos guarda-lo num dos métodos anteriores, fazer o CheckOut(), Update e CheckIn(), NÃO ESQUECENDO de verificar o seu SPCheckOutType, pois não queremos mexer em nada que não está aprovado, ou não, fica ao vosso critério.

 

Vamos utilizar 2 campos, um Bool que me indica se o OCR está processado e um MultiText para colocar o OCR.

item.File.CheckOut();
item["OCR"] = VamosNessa();
item["BOOL"] = "1";
item.Update();
item.File.CheckIn("Ok");

 

Podem fazer o download do exemplo neste link CLICAR

 

CONCLUSÃO

 

Este método funciona melhor com formatos A4, também sugiro criarem um Serviço que processe esta informação, pois este processo é síncrono

 

João Tito Lívio
SharePoint Consultant
www.primesoft.pt

Microsoft Most Valuable Professional Office Systems desde 2002
 
Posted em 19-Dec-11
2 Comentários  |  Trackback Url  |  Link para este post | Bookmark este post com:        
 

Links para este post

Comentários


Ricardo Calejo comentou em Tuesday, 20-Dec-2011
Oi Tito. Aqui só estás a fazer FullOCR ao documento certo? A DevScope tem um produto de reoonhecimento de OCR, OMR e ICR que integra muito bem com SharePoint - SmartDocumentor. Se estiveres interessado em conhecer, dá-me um toque!


Joao Livio comentou em Tuesday, 20-Dec-2011
Viva Ricardo, exacto, este procedimento foi feito há algum tempo mas muito mais elaborado que retirava imagens de PDF's apenas para search.

Nome:
URL:
Email:
Comentário: