[ Blog ]
[ Wiki ]
[ Slideshare ]
[ Twitter ]

Bloggers recientes

Cesar Capillas Mensajes: 110
Estrellas: 7
Fecha: 18/05/13
Gustavo Fernandez Mensajes: 44
Estrellas: 7
Fecha: 10/05/13
Patricia Yagüe Mensajes: 2
Estrellas: 0
Fecha: 2/04/12

Archivo

Tags

noBlogo - El blog de zylk.net

Entradas con etiqueta <em>integration</em>.

Integración de OCR en Alfresco

Hace un par de semanas, Toni de la Fuente y yo intercambiamos unos correos, y entre los temas que tratamos hablamos sobre qué estábamos pensando escribir en los blogs respectivos y ambos coincidíamos con algo relacionado con Alfresco y OCR, algo sencillo pero que ofreciera una nueva funcionalidad al usuario final, así que quedamos unos días más tarde para profundizar en el tema y ponernos manos a la obra. Aquí está el resultado:

Introducción

En el siguiente artículo vamos a ver cómo configurar Alfresco para poder indexar automáticamente el contenido de un fichero TIF escaneado, subirlo al repositorio y poder localizarlo posteriormente buscando por el contenido del mismo. Todo ello pasándole a cada fichero TIF un OCR de forma transparente para el usuario.

En materia de escaneo y almacenamiento de información en Alfresco se ha escrito mucho y hay muchas soluciones disponibles de diferente índole que ya vimos aquí hace tiempo.

Cuando se va ha digitalizar una gran cantidad de contenidos en papel y se quiere extraer su contenido vía OCR para poderlo indexar con Alfresco, disponemos de varias herramientas empresariales que permiten revisión, OCR zonal, mayor escalabilidad, mapeo de metadatos, capacidades de integración, inyección masiva y otras funcionalidades propias de entornos donde se va a hacer un uso intensivo de estas características. Para eso se encuentra aplicaciones como las siguientes:

Caso de uso

Como hemos comentado anteriormente, con las indicaciones que se explican a continuación conseguimos extraer la información OCR de un fichero TIF de forma transparente, el texto extraído del documento escaneado es indexado automáticamente.

En principio las pruebas las hemos hecho en Linux (Ubuntu y CentOS) usando Tesseract versión 2.04 y Alfresco 3.3/3.4 (tanto Community como Enterprise)

Usando Tesseract

Hemos elegido Tesseract por ser uno de los más comunes OCR en el mundo Open Source, pero se puede usar cualquier otro, e incluso añadiendo más características. Usando Tesseract 2.X hay que tener en cuenta que los TIF que se suben deben estar sin comprimir ya que es el único formato que soporta esta versión. Para soportar TIF comprimido hay que usar la versión 3 de Tesseract.

Hay otros OCR tanto libres como privativos, cada uno soporta unos ficheros de entrada u otros aunque en casi todos los casos el común denominador es el formato TIF. Algunos ejemplos de software alternativo a Tesseract son gocr, ocrad, ocropus o cuneiform. Para Windows hay otros como TigerOCR o incluso los mismos Tesseract y cuneiform tienen versiones para Windows.

Una vez instalado Tesseract bien sea compilando o mediante apt/yum. Podemos probar su correcto funcionamiento con el siguiente comando (especificamos el idioma aunque por defecto está en inglés, así que debes instalar el idioma correspondiente que viene con el paquete):

tesseract documento.tif documento -l spa

Recuerda que el documento.tif debería ser un fichero de un documento escaneado en español y con formato TIF sin comprimir, documento es la salida del comando, es decir, un fichero txt con el contenido detectado mediante el ocr. La opción –l permite especificar el idioma del documento escaneado para afinar el reconocimiento.

Si el comando anterior ha funcionado correctamente podemos seguir.

Creación del script

Ejecutando el comando anterior obtendremos en un archivo de texto el conjunto de palabras extraídas de la imagen en cuestión. Esto en principio no es una tarea sencilla para el motor de OCR y no siempre extraerá con éxito las palabras, a no ser que este bien entrenado.

Desde el punto de vista de Alfresco prepararemos un transformador, que invoca un script de shell que transforma un archivo tif a texto plano (extrae el texto identificado). Automaticamente el texto  obtenido se indexará en el motor de Lucene de Alfresco. Esta misma idea se ha utilizado en otros transformadores como la siguiente, donde extraiamos el texto de un texto XML via xmlstarlet:

El script va hacer algunas cosas más y está hecho en python (ocr-simple.py) y para su ejecución se necesita un interprete de python. El script hace algunas cosillas más que la ejecución del comando en cuestión. Por ejemplo, utiliza un diccionario de palabras donde cotejar las coincidencias. Por defecto utiliza una ruta que apunta al diccionario de palabras de ispell en Linux (paquete ispell o aspell dependiendo de la distribución), pero se puede utilizar otro archivo. Por otro lado, el script limpia y normaliza las palabras obtenidas por el ocr y recoge aquellas que tienen más de tres caracteres. Buena parte de estas acciones de limpieza y normalización seguro que las hace internamente Lucene pero nunca están de más. Aquí podemos ver el contenido del fichero ocr-simple.py (modifica las rutas según tu sistema y hazlo ejecutable):

#!/usr/bin/python
from os import popen
from string import split,join
from pprint import *
import re
import sys

def uniq(seq):
    # Not order preserving
    keys = {}
    for e in seq:
        keys[e] = 1
    return keys.keys()

# Tamano maximo
maxstr  = 3

# Comando ocr en la salida estandar
#command = popen('/usr/bin/pngtopnm '+sys.argv[1]+' | /usr/bin/ocrad')
#command = popen('/usr/bin/pngtopnm '+sys.argv[1]+' | /usr/bin/gocr -')
command = popen('/usr/bin/tesseract '+sys.argv[1]+' /tmp/tesser-$$ 2> /dev/null; \
 cat /tmp/tesser-$$.txt')

# Diccionario
dictwrd = open("/usr/share/dict/words","r")
s       = dictwrd.read()
# Lineas ocr
lines   = command.readlines()
#pprint(lines)
text = []
for i in lines:
  # Quitar los saltos de linea
  i = i.strip("\n")
  # En minusculas
  i = i.lower()
  for j in i.split(" "):
    # Quitar los puntos y comas....
    myregex = re.compile(r"[^\w\s]")
    j = myregex.sub('', j)
    # Tamano maximo de palabra
    if len(j) >= maxstr:
      if re.search(j, s):
        text.append(j)
      #  print j, "Match!"      # char literal
      #else:
      #  print j, "upppss!"

zz = open("/tmp/ocr.log","w")
zz.write(sys.argv[1]+"\n")
zz.write(join(uniq(text), " "))

# Palabras unicas
outputf = open(sys.argv[2],"w")
outputf.write(join(uniq(text), " "))

 

Un sitio para alojarlo puede ser: $ALF_HOME/bin

HINT: Se pueden usar otros OCR, por ejemplo, sustituyendo el comando de tesseract e instalando el OCR correspondiente (ocrad, gocr)

#command = popen('/usr/bin/pngtopnm '+sys.argv[1]+' | /usr/bin/ocrad')
#command = popen('/usr/bin/pngtopnm '+sys.argv[1]+' | /usr/bin/gocr -')
 
 

Creación del transformador

El transformador se configura en el directorio de extensiones de Alfresco es decir:

$ALF_HOME/tomcat/shared/classes/alfresco/extension

Se define el worker, la invocación al script ocr-simple.py (que tiene que tener permisos de ejecución) y el mimetype de los archivos sobre los que se aplica la transformación, en este caso, de tif a texto plano (revisa las rutas de este xml para que estén acorde a tu instalación):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
 "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

  <bean id="transformer.OCRToText" 
        class="org.alfresco.repo.content.transform.ProxyContentTransformer" 
        parent="baseContentTransformer">
      <property name="worker">
         <ref bean="transformer.worker.OCRToText" />
      </property>
  </bean>

  <bean id="transformer.worker.OCRToText" 
 class="org.alfresco.repo.content.transform.RuntimeExecutableContentTransformerWorker">
      <property name="mimetypeService">
         <ref bean="MimetypeService"/>
      </property>
      <property name="transformCommand">
         <bean class="org.alfresco.util.exec.RuntimeExec">
            <property name="commandsAndArguments">
                <map>
                    <entry key="Linux">
                        <list>
                            <value>/usr/bin/python</value>
                            <value>/opt/alfresco33/bin/ocr-simple.py</value>
                            <value>${source}</value>
                            <value>${target}</value>
                        </list>
                    </entry>
                </map>
            </property>
         </bean>
      </property>

    <property name="explicitTransformations">
      <list>
        <bean class="org.alfresco.repo.content.transform.ExplictTransformationDetails">
          <property name="sourceMimetype"><value>image/tiff</value></property>
          <property name="targetMimetype"><value>text/plain</value></property>
        </bean>
      </list>
    </property>

  </bean>
</beans>

Por descontado el transformador se puede extender a otros mimetypes de tipo imagen aunque esto no lo detallaremos aquí. También se podría implementar fácilmente en Windows.

Ejemplo de uso

Una vez dispuesto el fichero ocr-context.xml en el directorio de extensiones y el script de python ocr-simple.py en el directorio bin y reiniciado el servidor, tan sólo tenemos que subir una imagen en formato tif (con extension .tif). Una vez subida podemos buscar alguno de los términos en el buscador de la parte superior derecha de Alfresco Explorer o Share, por ejemplo, las palabras lazy o fox. De este modo subimos el archivo simple.tif a Alfresco:

Y buscamos la palabra fox de la imagen:

El resultado es el siguiente, aparecen un conjunto de archivos indexados que contienen la palabra fox, entre ellos la imagen que acabamos de subir:

 

Para trazar lo que esta haciendo el transformador se puede activar el log4j ($ALF_HOME/tomcat/webapps/alfresco/WEB-INF/classes/log4j.properties)

log4j.logger.org.alfresco.util.exec.RuntimeExec=DEBUG

log4j.logger.org.alfresco.repo.content.transform.ContentTransformerRegistry=DEBUG

Referencias:

Entrada en el foro de Alfresco en Español:

http://forums.alfresco.com/es/viewtopic.php?f=11&t=2979&start=0&hilit=tesseract

Tesseract OCR:

http://code.google.com/p/tesseract-ocr/wiki/ReadMe

Ficheros usados en el artículo: ocr-files-web.

Sinadura connector for Nuxeo DM

Sinadura is an open source java-based multiplatform desktop application for signing PDF's, that provides a simple solution for digital signature and electronic invoice processes. This software guarantees the integrity, the identity, and the no repudiation of any PDF document, for example, in payslips, contracts, invoices or certifications.

The legal disquisitions regarding to the storage, custody or preservation of many of these signed documents for companys and public administrations recommend the use of enterprise content management systems such as Alfresco ECM or Nuxeo DM. The ECM systems can help us to manage the full document lifecycle, involving sinadura desktop client in digital signing processes/workflows with this integration. The process of signing is performed on the client side, and therefore, we can use both smartcard (pkcs11) or software certificates (pkcs12) for the common signing features of sinadura (visible stamps, customized background images, TSA timestamps or OCSP validation)

In previous posts (in spanish), we commented the integration of sinadura client with Alfresco ECM repository
, which covered the basic ECM functionality for adding, updating, browsing, downloading and deleting documents from sinadura client. The ECM functionality is now implemented in sinadura client for Nuxeo DM 5.3.x via REST API, including the next repository actions:

 

  • Add to Nuxeo path: This option allows us to add selected PDF documents in sinadura client to a chosen workspace in the Nuxeo repository. The final path  is selected with the help of a sinadura browsing component.
  • Add to Nuxeo default path: The default path is defined with the browsing component in sinadura preferences. Then, the selected pdf's are added directly to this default path.
  • Download from Nuxeo: This option allows us to browse the Nuxeo repository and to download locally a chosen PDF file to sinadura client.
  • Update in Nuxeo: With this option, we can update a file in the repository, which can be previously downloaded from Nuxeo repository (and signed with sinadura).
  • Create Workspaces: We can create new workspaces from sinadura client in the repository.
  • Delete from Nuxeo: We can also delete a document in the repository via this option (always with the necessary permissions).


I let here some of the screenshots of the sinadura connector for Nuxeo. For example, the Nuxeo repository authentication preferences:


 

The default path for adding PDF's in Nuxeo repository is also selected in preferences window:

Updating a signed document in Nuxeo:


We are currently working in sinadura 3.0, which will allow to sign any type of file (not only a PDF file). Please contact us, for more information about the connector, or about digital signing and enterprise content management services.

Mostrando 2 resultados.