cancel
Showing results for 
Search instead for 
Did you mean: 

Tesseract full integration

normando
Champ in-the-making
Champ in-the-making
Hola a todos. Espero que lo siguiente les sea útil a quiénes deseen realizar búsquedas de texto en documento escaneados TIF, y en linux.

Antes debo hacer alguna aclaraciones.

Tesseract 2.x NO funciona con archicos con extensión .tiff , sólo funciona con archivos .tif . La versión 3.0 sí lo hace. A continuación pongo la versión para Tesseract 2.x, dado que Alfresco modifica los archivos TIF a TIFF en el proceso de transformación, y luego lo guarda nuevamente a .TIF (alguien sabe si este se puede cambiar y dejarlo sólo en .tif?).

Hay otro problema más, y es que Tesseract da siempre como archivo de salida uno finalizado en txt, por lo tanto si le agregamos la extensión, obtendremos un archivo.txt.txt. Por este motivo he realizado un wrapper para eviatr este problema, y que Alfresco pueda indexar correctamente.

En primer lugar debemos probar Tesseract desde la consola:

tesseract archivo.tif archivosalida -l spa

archivosalida lo dejamos sin extensión. Si todo funciona correctamente.

Creamos un archivo ocrtiff-transform-context.xml en /tomcat/shared/classes/alfresco/extenssion con el siguiente contenido:

<?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.worker.ocr.tiff" class="org.alfresco.repo.content.transform.RuntimeExecutableContentTransformerWorker">

        <property name="mimetypeService">
            <ref bean="mimetypeService" />
        </property>

          <property name="checkCommand">
             <bean class="org.alfresco.util.exec.RuntimeExec">
                <property name="commandsAndArguments">
                    <map>
                        <entry key=".*">
                            <list>
<!–                            <value>tesseract</value> –>
                                <value>/opt/alfresco/ocr</value>
                            </list>
                        </entry>
                    </map>
                </property>
                <property name="errorCodes">
                   <value>2</value>
                </property>
             </bean>
          </property>

          <property name="transformCommand">
             <bean class="org.alfresco.util.exec.RuntimeExec">
                <property name="commandsAndArguments">
                    <map>
                        <entry key=".*">
                            <list>
<!–                            <value>tesseract</value>
                                <value>${source}</value>
                                <value>${target}</value>
                                <value>-l</value>
                                <value>spa</value> –>
                                <value>/opt/alfresco/ocr</value>
                                <value>${source}</value>
                                <value>${target}</value>
                            </list>
                        </entry>
                    </map>
                </property>
                <property name="errorCodes">
                   <value>1,2</value>
                </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>

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

Luego, un pequeño wrapper para efectuar todas las modificaciones del caso y que Tesseract no muera en el intento. En la raíz de donde tengan instalado Alfresco (en mi caso /opt/alfresco) crean un archivo con permisos de ejecución (755) llamado 'ocr' con el siguiente contenido:

#!/bin/bash
# save arguments to variables
SOURCE=$1
TARGET=$2
TMPDIR=/tmp
FILENAME=`basename $SOURCE`
OCRFILE=$FILENAME.tif

# to see what happens
#echo "from $SOURCE to $TARGET" >>/tmp/ocrtransform.log

cp -f $SOURCE $TMPDIR/$OCRFILE

# call tesseract and redirect output to $TARGET
tesseract $TMPDIR/$OCRFILE ${TARGET%\.*} -l spa
rm -f $TMPDIR/$OCRFILE

Si quieren sabér qué ocurre cuando Alfresco hace las transformaciones, descomenten la línea del log.

Ahora solo resta reiniciar Alfresco, y subir cualquier archivo .tif para que éste sea indexado correcta. Es super veloz amigos

Cualquier duda comenten. Para los que más sepan, les agradeceré cualquier mejora en el script y transformer. Gracias

Happy ocring 🙂
15 REPLIES 15

cesarista
World-Class Innovator
World-Class Innovator
Hola Urbano:

El script se ejecuta según el log en /home/urbano/Escritorio/ocr-simple.py, y por el error parece que no genera el archivo /tmp/tesser-6399.txt donde el numero es el proceso del shell script que se ejecuta en el comando popen de python. Ten en cuenta, que tesseract esta en /usr/bin/tesseract

Si me dices que te funciona el script en una terminal me descolocas un poco, porque hay dos posibles fuentes de error, o el comando tesseract no funciona correctamente (por ejemplo, las rutas no estan bien o no estan el path) y no da resultados en la salida estándar de modo que no se redirecciona al archivo temporal, o bien hay un problema de permisos. Y por lo que dices y veo, descarto el problema de permisos ya que el usuario que utilizas es tu usuario sin privilegios urbano, tanto en la terminal como en el proceso java de alfresco (por eso te da errores en el log con el ftp y con el cifs, porque no puedes abrir esos puertos sin privilegios) .

Por otro lado, el path del script de python se declara en el transformador (yo lo he puesto en /opt/alfresco/bin/). Pon el resultado que te da el script ocr-python.py en la terminal al aplicarlo sobre la imagen y lo miramos.

Un saludo.

–C.

cesarista
World-Class Innovator
World-Class Innovator
Por cierto:

Sin relación con el problema anterior os dejo un enlace con otros aspectos sobre la integración de tesseract con Alfresco.

http://tpeelen.wordpress.com/2010/12/17/alfresco-using-tesseract-ocr-on-ubuntu-linux/

Un saludo.

–C.

urban
Champ in-the-making
Champ in-the-making
Hola Urbano:

El script se ejecuta según el log en /home/urbano/Escritorio/ocr-simple.py, y por el error parece que no genera el archivo /tmp/tesser-6399.txt donde el numero es el proceso del shell script que se ejecuta en el comando popen de python. Ten en cuenta, que tesseract esta en /usr/bin/tesseract

Si me dices que te funciona el script en una terminal me descolocas un poco, porque hay dos posibles fuentes de error, o el comando tesseract no funciona correctamente (por ejemplo, las rutas no estan bien o no estan el path) y no da resultados en la salida estándar de modo que no se redirecciona al archivo temporal, o bien hay un problema de permisos. Y por lo que dices y veo, descarto el problema de permisos ya que el usuario que utilizas es tu usuario sin privilegios urbano, tanto en la terminal como en el proceso java de alfresco (por eso te da errores en el log con el ftp y con el cifs, porque no puedes abrir esos puertos sin privilegios) .

Por otro lado, el path del script de python se declara en el transformador (yo lo he puesto en /opt/alfresco/bin/). Pon el resultado que te da el script ocr-python.py en la terminal al aplicarlo sobre la imagen y lo miramos.

Un saludo.

–C.

Gracias por tu rápida respuesta Cesar, ahora he colocado el script en la ruta /usr/share/tomcat6/bin y también he especificado esta ruta en ocr-context.xml, he probado el script desde la linea de comandos de la siguiente forma: ./ocr-simple.py simple.tif salida y se ejecuta con exito, el fichero "salida" contiene el texto de la imagen. Después he reiniciado el servidor de alfresco y he subido la imagen simple.tif a este pero no me realiza la búsqueda. Como tu indicabas no se ha generado ningun fichero tesser-xxxx en /tmp, este es el contenido de /tmp/ocr.log
/tmp/tomcat6-temp/Alfresco/RuntimeExecutableContentTransformerWorker_source_3474341795967203523.tiff

Un saludo, Urbano.

dvillasevil
Champ in-the-making
Champ in-the-making
Un post estupendo!, estamos probando Alfresco en nuestra organización y contamos con una cantidad importante de documentos escaneados.

Voy a probar lo que ponéis por aquí aunque me gustaría si alguien sabe como tratar directamente con ficheros PDF ya que las máquinas modernas de escaneo ya generan PDF multipágina de manera predeterminada.

Un saludo y muchas gracias.

malleshwari
Champ in-the-making
Champ in-the-making
hi,

  i am trying to integrate alfresco with tesseract in linux environment, i done in windows but i am facing problem in linux environment please help me.


OCR.sh

echo "hello">>tmp/ocrtransform.log
SOURCE=$1
    TARGET=$2
    TMPDIR=tmp/ocrtransform.log
    FILENAME=`basename $SOURCE`
    sudo OCRFILE=$FILENAME.tif
    # to see what happens
    sudo echo "from $SOURCE to $TARGET" >>tmp/ocrtransform.log
    sudo cp -f $SOURCE $TMPDIR/$OCRFILE
    # call tesseract and redirect output to $TARGET
    sudo /root/tesseract-ocr/tesseract $TMPDIR/$OCRFILE ${TARGET%\.*} -l eng
    sudo rm -f $TMPDIR/$OCRFILE

this is the errror i am getting.

os:         Linux
   command:    tesseract /var/www/html/alfresco/ocr.sh
   succeeded:  false
   exit code:  1
   out:       
   err:        tesseract: /var/www/html/alfresco/common/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by /usr/local/lib/libtesseract.so.3)
  
   tesseract: /var/www/html/alfresco/common/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by
23:48:32,570 INFO  [org.alfresco.repo.management.subsystems.ChildApplicationContextFactory] Starting 'Transformers' subsystem, ID: [Transformers, default]


Thanks,

os:         Linux
   command:    tesseract /var/www/html/alfresco/ocr.sh
   succeeded:  false
   exit code:  1
   out:       
   err:        tesseract: /var/www/html/alfresco/common/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by /usr/local/lib/libtesseract.so.3)
  
   tesseract: /var/www/html/alfresco/common/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by
23:48:32,570 INFO  [org.alfresco.repo.management.subsystems.ChildApplicationContextFactory] Starting 'Transformers' subsystem, ID: [Transformers, default]


thanks,
Malleshwari.

miguelangel81
Champ in-the-making
Champ in-the-making
Intenté el script probarlo por sí sólo y funciona (el primer script de linux), pero al integrarlo en alfresco no funciona. Estoy usando Alfresco-5.0.a.
Gracias