AnsweredAssumed Answered

Tesseract full integration

Question asked by normando on Oct 30, 2010
Latest reply on Aug 11, 2014 by dvillasevil
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 :-)

Outcomes