Identificar en un Transform el nombre del archivo

cancel
Showing results for 
Search instead for 
Did you mean: 
normando
Member II

Identificar en un Transform el nombre del archivo

Hola amigos y amigas!

Volviendo al temilla sobre el OCR con Tesseract que habíamos visto hace algún tiempo, ahora tengo la necesidad de distinguir el nombre del archivo TIFF porque en base a su nombre o parte del nombre debo decidir si efectuar el OCR en español, inglés o alemán.

Por ejemplo, al archivo 123123123-spa.tif deberá hacerse el OCR en español, al 12312313-eng.tif en inglés, y asi sucesivamente.

Preferí esta disposición a elegir una carpeta en la cual almacenar los archivos para OCR en español, otra en alemán, etc. porque me da independencia de movimientos. Por ejemplo, esto me permite tener en una misma carpeta archivos en alemán, inglés, etc.

Ahora bien, como podemos ver, la cadena de texto que determina en qué idioma debo hacerle el OCR son los tres últimos caracteres antes de la extensión, es decir, a partir del guión medio.

Y acá esta mi pedido de ayuda, de por dónde puedo comenzar a estudiar esto. Quizás dentro del conten-transformer-worker que pego debajo, se puede incluir alguna sentencia condicional del tipo IF y que analice un expresión regular en el nombre del archivo y en base a ello tomar las acciones pertinentes, que en el caso de Tesserat, concistirá solamente en agregarle al final de la linea de comando el parámetro -l con el string del idioma, por ejemplo:
-l eng
o
-l spa

Muchas gracias.

<?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>
3 Replies
normando
Member II

Re: Identificar en un Transform el nombre del archivo

Bueno, he buscado y leído tantas cosas que ya estoy mareado. La verdad es que alfresco es una plataforma impresionante, pero captar toda la mecánica de configuración o extensión no es para cualquiera, especialmente si el conocimiento en java es poco.

Bueno, si alguien sabe al menor por dónde puedo encarar esto, le estaría muy agradecido.

Saludos
ajv
Member II

Re: Identificar en un Transform el nombre del archivo

Hola Normando,

La interfaz ContentTransformerWorker define el método:
public void transform(ContentReader reader, ContentWriter writer, TransformationOptions options) throws Exception
El parámetro options tiene un par de métodos que podrían venir bien para ello: options.getSourceNodeRef() y options.getTargetNodeRef(). A partír de ahí, y con el NodeService inyectado podrías obtener la propiedad cm:name para hacer el filtrado.

Ahora bien, no he visto ninguna opción de "alimentar" esas opciones directamente definiendo el transformador desde el RuntimeExecutableContentTransformerWorker.
Y peor aún, he definido mi propio transformador extendiendo de OCRContentTransformer para tener un control total de la transformación (y poder tener acceso a las opciones estas de transformación) y los nodos origen y destino me vienen vacíos. El motivo es que internamente utiliza el constructor "vacío" para pasar unas opciones sin opción alguna.
Así mirando código de Alfresco, el único punto donde he detectado el uso de las opciones de transformación pasándole datos reales de los nodos que participan en la transformación es en la clase org.alfresco.repo.action.executer.TransformActionExecuter, método doTransform (por si te da alguna pista de cómo seguir)…


Por cierto, ¿habeis podido transformar pdf's que contengan imágenes a través de este transformador de tesseract? Por defecto me aplica el de Alfresco (PdfBox) y no me llega a interpretar nada de la imagen del pdf…
Saludos y suerte!
normando
Member II

Re: Identificar en un Transform el nombre del archivo

Hola ajv. Muchas gracias por la detallada explicación de todo.

Voy a intentar ver qué se puede hacer utilizando TransformActionExecuter para obtener el name del archivo. Te cuento ni bien tenga novedades.

Con respecto a los pdfs no he utilizado tesseract aún en ellos, pero pronto lo haré. Por suerte ahora tesseract 3 ya maneja sin problemas archivos con extensión tiff y tif. Por ello es necesario convertir previamente de pdf a tiff para luego hacer el ocr. Con el convert de ImageMagick es perfectamente posible. Yo puedo convertir desde la consola directamente ejecutando:

convert archivo.pdf archivo.tif

Seguramente (no lo vi en detalle aún) existen algunos parámetros de conversión que aceleren la misma.

Otro detalle a considerar con los PDFs es cómo identificamos a los que contienen alguna imagen de los que no, y además cómo identificamos a los pdfs que ya vienen con el texto "buscable" incluido de los que no. Es todo un tema a analizar.

Saludos y gracias por todo.