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 |