Según la consultora IDC, más del 80% de la información es de tipo NoSQL, especialmente texto en documentos. Cuando los servicios o aplicaciones digitales no procesan toda esta información, la empresa pierde. Para resolver este desafío, es posible utilizar la tecnología OCR. El Reconocimiento Óptico de Caracteres (OCR) utiliza la tecnología de *machine learning* y/o el reconocimiento de patrones en imágenes para transformar los pixeles de las imágenes en texto. Esto es importante porque muchos documentos se escanean como imágenes, o muchos documentos contienen imágenes con texto en su interior. Por eso la tecnología OCR es un paso importante para obtener toda la información posible de un documento. Para hacer OCR de un documento, la solución de código abierto más utilizada es Tesseract de Google, es la más popular entre la comunidad que utiliza Python y Java. Tesseract es compatible con más de 100 idiomas y puede aprender a reconocer nuevos modelos, como matrículas de automóviles, captchas y muchas cosas más. Tesseract fue creada en C++, de modo que Java lo utiliza con la ayuda de un intermediario llamado Tess4J. Este código sirve de muestra:
private String extractTextFromImage(File tempFilethrows TesseractException {
 
        ITesseract tesseract = new Tesseract();
        tesseract.setDatapath("/usr/share/tessdata/"); //directory to trained models
        tesseract.setLanguage("eng+por"); // choose your language/trained model
 
        return tesseract.doOCR(tempFile); //call tesseract function doOCR() 
                                          //passing the file to be processed with OCR technique
 
    }
Para permitir que IRIS utilice esta clase de Java y obtenga los resultados desde Java, necesitamos utilizar las soluciones PEX y Java Gateway. En primer lugar, es necesario configurar el proxy de Java en la producción y, en segundo lugar, configurar una *Business Operation* o *Service* en PEX para comunicar IRIS y Java en una producción.
Class dc.ocr.OcrProduction Extends Ens.Production
{
 
XData ProductionDefinition
{
<Production Name="dc.ocr.OcrProduction" LogGeneralTraceEvents="false">
  <Description></Description>
  <ActorPoolSize>2</ActorPoolSize>
  <Item Name="OcrService" Category="" ClassName="dc.ocr.OcrService" PoolSize="1" Enabled="true" 
Foreground="false" Comment="" LogTraceEvents="false" Schedule=""> 
  </Item>
  <Item Name="JavaGateway" Category="" ClassName="EnsLib.JavaGateway.Service" PoolSize="1" 
Enabled="true" Foreground="false" Comment="" LogTraceEvents="false" Schedule="">
    <Setting Target="Host" Name="ClassPath">.:/usr/irissys/dev/java/lib/JDK18/*:/opt/irisapp/*
:/usr/irissys/dev/java/lib/gson/*
:/usr/irissys/dev/java/lib/jackson/*:/jgw/ocr-pex-1.0.0.jar
</Setting> 
    <Setting Target="Host" Name="JavaHome">/usr/lib/jvm/java-8-openjdk-amd64/</Setting> 
  </Item> 
  <Item Name="OcrOperation" Category="" ClassName="EnsLib.PEX.BusinessOperation" PoolSize="1" 
Enabled="true" Foreground="false" Comment="" LogTraceEvents="false" Schedule=""> 
    <Setting Target="Host" Name="%gatewayPort">55555</Setting> 
    <Setting Target="Host" Name="%remoteClassname">community.intersystems.pex.ocr.OcrOperation</Setting> 
    <Setting Target="Host" Name="%gatewayExtraClasspaths">.:/usr/irissys/dev/java/lib/JDK18/*
:/opt/irisapp/*:/usr/irissys/dev/java/lib/gson/*
:/usr/irissys/dev/java/lib/jackson/*
:/jgw/ocr-pex-1.0.0.jar
</Setting> 
  </Item> 
</Production>
}
 
}
¡Ahora cualquier producción de IRIS puede comunicarse con Java y Tesseract! Para comprobarlo, mira:
//call ocr method to get text from image, if you want to use pex
        Set pRequest = ##class(dc.ocr.OcrRequest).%New()
        Set pRequest.FileName = file.Filename
        
        // call java pex operation to do ocr, passing file into pRequest and receive ocr text with pResponse
        Set tSC = ..SendRequestSync("OcrOperation"pRequest, .pResponse1200)
        
        //save the results into database to use text analytics - nlp
        Set ocrTable = ##class(dc.ocr.OcrTable).%New()
        Set ocrTable.FileName = file.Filename
        Set ocrTable.OcrText = pResponse.StringValue
 
Set tSC = ocrTable.%Save()
Toda la información sobre el código, con los respectivos comentarios, puede encontrarse en mi repositorio del servicio OCR (https://openexchange.intersystems.com/package/OCR-Service). Ahora, con el texto extraído, necesitamos utilizar el motor PNL de IRIS para analizar los datos del texto y obtener información que nos permita tomar decisiones. Para ello, cuando se extrae un texto, se guarda en una tabla, y dicha tabla es utilizada por el motor de PNL como una fuente de texto. Mira la tabla %Save() anterior y analiza el siguiente código con PNL, que hace referencia a la OCRTable (que incluye los textos extraídos):
Class dc.ocr.OcrNLP Extends %iKnow.DomainDefinition [ ProcedureBlock ]
{
 
XData Domain [ XMLNamespace = "http://www.intersystems.com/iknow" ]
{
<domain name="OcrNLP" disabled="false" allowCustomUpdates="true">
<parameter name="DefaultConfig" value="OcrNLP.Configuration" isList="false" />
<data dropBeforeBuild="true">
<table listname="OcrNLPTable" batchMode="true" disabled="false" 
listerClass="%iKnow.Source.SQL.Lister" tableName="dc_ocr.OcrTable" idField="ID" 
groupField="ID" dataFields="OcrText" metadataColumns="FileName" metadataFields="filename" />
</data>
<matching disabled="false" dropBeforeBuild="true" autoExecute="true" ignoreDictionaryErrors="true" />
<metadata>
<field name="filename" operators="=" dataType="STRING" storage="0" caseSensitive="false" disabled="false" />
</metadata>
<configuration name="OcrNLP.Configuration" detectLanguage="true" languages="en,pt" 
userDictionary="OcrNLP.Dictionary#1" summarize="true" maxConceptLength="0" />
<userDictionary name="OcrNLP.Dictionary#1" />
</domain>
}
 
}
Consulta toda la información y la configuración en mi repositorio de GitHub sobre el servicio OCR. Ahora podemos cargar algunos archivos e ir al Explorador para ver los conceptos y el CRC generados. Este gif incluye todos los pasos comentados en este artículo: ![](https://github.com/yurimarx/ocr-service/raw/master/nlp2.gif)