Extractor de metadatos para MS Office

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

Extractor de metadatos para MS Office

Hola a la comunidad.

Después de varios días implementando un extractor de metadatos en la versión 3.4 para documentos excels 2003 y 2007, no he podido mostrar los metadatos extraídos como aspectos del modelo de contenido de Alfresco. Necesito ayuda.

Para el desarrollo del extractor consulte la siguiente pagina de la wiki:
http://wiki.alfresco.com/wiki/Metadata_Extraction

Os pongo aquí la configuración y declaración del extractor:

custom-metadata-extrators-context.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"[]>

<!– Registrar nuevo extractor de metadato personalizado de office –>
<beans>
    <bean id="extracter.CustomOpenOffice"  class="org.alfresco.sample.CustomOpenOfficeMetadataExtracter" parent="baseMetadataExtracter">
        <property name="inheritDefaultMapping">
            <value>true</value>
        </property>
        <property name="mappingProperties">
            <props>
                <prop key="namespace.prefix.cds">http://www.cds.org/model/content/1.0</prop>
                <prop key="category">cds:clasificacion</prop>
                <prop key="template">cds:plantilla</prop>
            </props>
        </property>
    </bean>
</beans>

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

<!– Registrar el nuevo extractor de metadato personalizado de office –>
<beans>
     
      <bean id="extracter.CustomOpenOffice" class="org.alfresco.sample.CustomOpenOfficeMetadataExtracter" parent="baseMetadataExtracter" />

</beans>


CustomOpenOfficeMetadataExtracter.java
package org.alfresco.sample;

import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.Map;
import java.util.ArrayList;

import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.content.metadata.TikaPoweredMetadataExtracter;

import org.apache.log4j.Logger;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.tika.metadata.Metadata;

import org.apache.tika.parser.Parser;
import org.apache.tika.parser.microsoft.OfficeParser;


import org.alfresco.service.cmr.repository.ContentReader;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class CustomOpenOfficeMetadataExtracter extends TikaPoweredMetadataExtracter {

   public static final String KEY_CATEGORY = "category";
   public static final String KEY_TEMPLATE = "template";   
   public static ArrayList<String> SUPPORTED_MIMETYPES= buildSupportedMimetypes(new String[] {MimetypeMap.MIMETYPE_EXCEL}, new OfficeParser());
   private static final String CUSTOM_PREFIX = "cds:";
    protected static Log logger = LogFactory.getLog(CustomOpenOfficeMetadataExtracter.class);
      
   
   public CustomOpenOfficeMetadataExtracter() {
       super(SUPPORTED_MIMETYPES);
       //logger.debug("Initializing CustomOpenOfficeMetadataExtracter logger constructor");

       // TODO Auto-generated constructor stub
      
      
   }

   @Override
   protected Parser getParser() {
      // TODO Auto-generated method stub      
      return new OfficeParser();
   }
   
   @Override
   public Map<String, Serializable> extractRaw(ContentReader reader)  {
        Map<String, Serializable> rawProperties = newRawMap();
        Metadata metadatap=new Metadata();
       
                 
        putRawValue("category", metadatap.get(Metadata.CATEGORY), rawProperties);
        putRawValue("template", metadatap.get(Metadata.TEMPLATE), rawProperties);
       
       
       
        String metadataCategory= metadatap.get(Metadata.CATEGORY);
        logger.info("\n\nPropiedad categoria:" + metadataCategory + "\n"); 
       
       
       
        String metadataTemplate= metadatap.get(Metadata.TEMPLATE);
        logger.info("\n\nPropiedad plantilla:" + metadataTemplate + "\n"); 
       
       
        logger.info("Poniendo datos?");      
        logger.info("\n\nPropiedades de vuelta:" + rawProperties.toString() + "\n");

        return rawProperties;
   }
    
      
}

A continuación pongo el modelo de contenido creado:

cdsModel.xml
<?xml version="1.0" encoding="UTF-8"?>

<model name = "cds:cdsmodel" xmlns = "http://www.alfresco.org/model/dictionary/1.0">
   <!– Metadatos opcionales del modelo personalizado –>  
   <description>Modelo personalizado</description>
   <author>Yaraiza</author>
    <version>1.0</version>
   
   <imports>
      <!– Importamos definiciones de Alfresco, concretamente el dicionario y modelo de contenido –>
      <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>
      <!– Import Alfresco Content Domain Model Definitions –>
      <import uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/>
        </imports>
   
   <!– Registramos el Nuevo namespaces que se utilizara en este modelo –>   
   <namespaces>
      <namespace uri = "http://www.cds.org/model/content/1.0" prefix = "cds"/>
    </namespaces>
   
      
   <aspects>
      <!– Definicion de los aspectos personalizados del modelo –>
      <aspect name = "cds:aspectClasificacionDoc">
         <title>Clasificacion de Documentos</title>
         <properties>
            <property name = "cds:clasificacion">
               <title>Categoría</title>
               <type>d:text</type>
                </property>
            <property name = "cds:validar">
               <title>Validable</title>
               <type>d:boolean</type>
                    <default>false</default>
                </property>
            <property name = "cds:plantilla">
               <title>Plantilla</title>
               <type>d:text</type>
                </property>
         </properties>
      </aspect>
    </aspects>
</model>

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

<beans>
    <!– Registro del modelo cdsModel –>  
    <bean id="extension.dictionaryBootstrap" parent="dictionaryModelBootstrap" depends-on="dictionaryBootstrap">
        <property name="models">
            <list>
                <value>org/alfresco/sample/cdsModel.xml</value>
            </list>
        </property>
    </bean>

</beans>

web-client-config-custom.xml
<alfresco-config>
    
    
   <!– Si queremos que el nuevo aspecto aparezca como opción en el wizard de reglas de contenido–>
   <config evaluator = "string-compare" condition = "Action Wizards">    
      <aspects>
         <aspect name = "cds:aspectClasificacionDoc"/>
      </aspects>     
   </config>
  
  
   <!– Para poder editar las propiedades que hemos definido en el nuevo aspect–>
   <config evaluator = "aspect-name" condition = "cds:aspectClasificacionDoc">
      <property-sheet>
         <show-property name="cds:clasificacion" displaylabelid="Categoría"/>
         <show-property name="cds:validar" displaylabelid="Validable" readonly="true"/>
         <show-property name="cds:plantilla" displaylabelid="Plantilla" readonly="true"/>         
       </property-sheet>
   </config>
  
</alfresco-config>


Estoy haciendo algo mal?

Muchas gracias de antemano
5 Replies
cristinamr
Advanced

Re: Extractor de metadatos para MS Office

Si usas una 3.4 en adelante debes mirar la documentación del apache tika  :wink:

La compañera cybermakoki, se ha pegado una barbaridad con estos temas. Ojea este artículo que escribió en mi blog hace un par de años.

Creo que te servirá de ayuda ^__^
--
VenziaIT: helping companies since 2005! Our ECM products: AQuA & Seidoc
yaraiza
Member II

Re: Extractor de metadatos para MS Office

Gracias por responder.
Estaba un poco liada con el trabajo y no había actualizado la publicación.
Estuve revisando el articulo publicado en el blog y me sirvió de ayuda. Pero quedan algunos detalles por resolver.

1. Finalmente pude extraer los datos del documento.

2. Al depurar mi extractor de metadatos se muestra que guardo los valores.

15:10:10,593 DEBUG [org.alfresco.repo.content.metadata.AbstractMappingMetadataExtracter] Completed metadata extraction:
   reader:    ContentAccessor[ contentUrl=store://C:\Alfresco\tomcat\temp\Alfresco\alfresco1123639261342029096.upload, mimetype=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, size=8274, encoding=UTF-8, locale=en_US]
   extracter: org.alfresco.sample.CustomOpenOfficeMetadataExtracter@21eb3f
   changed:   {{http://www.cds.org/model/content/1.0}plantilla=null, {http://www.cds.org/model/content/1.0}clasificacion=CDS}

A continuación muestro el modelo de contenido personalizado

cdsModel.xml
<?xml version="1.0" encoding="UTF-8"?>

<model name = "cds:cdsmodel" xmlns = "http://www.alfresco.org/model/dictionary/1.0">
   <!– Metadatos opcionales del modelo personalizado –>  
   <description>Modelo personalizado</description>
   <author>Yaraiza</author>
    <version>1.0</version>
  
   <imports>
      <!– Importamos definiciones de Alfresco, concretamente el dicionario y modelo de contenido –>
      <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>
      <!– Import Alfresco Content Domain Model Definitions –>
      <import uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/>
        </imports>
  
   <!– Registramos el Nuevo namespaces que se utilizara en este modelo –>  
   <namespaces>
      <namespace uri = "http://www.cds.org/model/content/1.0" prefix = "cds"/>
    </namespaces>
  
     
   <aspects>
      <!– Definicion de los aspectos personalizados del modelo –>
      <aspect name = "cds:aspectClasificacionDoc">
         <title>Clasificacion de Documentos</title>
         <properties>
            <property name = "cds:clasificacion">
               <title>Categoría</title>
               <type>d:text</type>
                </property>
            <property name = "cds:validar">
               <title>Validable</title>
               <type>d:boolean</type>
                    <default>false</default>
                </property>
            <property name = "cds:plantilla">
               <title>Plantilla</title>
               <type>d:text</type>
                </property>
         </properties>
      </aspect>
    </aspects>
</model>

Pero en el cliente web no se me muestra la propiedad extraída.

Gracias de antemano.
cristinamr
Advanced

Re: Extractor de metadatos para MS Office

Para visualizar propiedades "personalizadas" (como es el caso de la tuya), si usas el cliente web necesitas tocar el web-client-config-custom.xml o en el caso del share el share-config-custom.xml

Lo has hecho?

Pegame aquí el contenido del que estés usand Smiley Wink
--
VenziaIT: helping companies since 2005! Our ECM products: AQuA & Seidoc
yaraiza
Member II

Re: Extractor de metadatos para MS Office

Este es el código del archivo web-client-config-custom.xml. Los aspectos si se muestran en el cliente web pero no me muestran el valor del metadato extraído del documento. Yo creo que debo tener algo mal en el la configuración del extractor.

Otra duda que tengo es necesario cambiar algún otro código de Alfresco para mostrar los metadatos extraídos en los aspectos agregados en Alfresco????? o En el código del extractor debería utilizar los Qname del modelo de contenido personalizado?????

web-client-config-custom.xml
    <alfresco-config>
        
        
       <!– Si queremos que el nuevo aspecto aparezca como opción en el wizard de reglas de contenido–>
       <config evaluator = "string-compare" condition = "Action Wizards">   
          <aspects>
             <aspect name = "cds:aspectClasificacionDoc"/>
          </aspects>     
       </config>
      
      
       <!– Para poder editar las propiedades que hemos definido en el nuevo aspect–>
       <config evaluator = "aspect-name" condition = "cds:aspectClasificacionDoc">
          <property-sheet>
             <show-property name="cds:clasificacion" displaylabelid="Categoría"/>
             <show-property name="cds:validar" displaylabelid="Validable" readonly="true"/>
             <show-property name="cds:plantilla" displaylabelid="Plantilla" readonly="true"/>        
           </property-sheet>
       </config>
      
    </alfresco-config>


Configuración del extractor:

custom-metadata-extrators-context.xml
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"[]>

    <!– Registrar nuevo extractor de metadato personalizado de office –>
    <beans>
        <bean id="extracter.CustomOpenOffice"  class="org.alfresco.sample.CustomOpenOfficeMetadataExtracter" parent="baseMetadataExtracter">
            <property name="inheritDefaultMapping">
                <value>true</value>
            </property>
            <property name="mappingProperties">
                <props>
                    <prop key="namespace.prefix.cds">http://www.cds.org/model/content/1.0</prop>
                    <prop key="category">cds:clasificacion</prop>
                    <prop key="template">cds:plantilla</prop>
                </props>
            </property>
        </bean>
    </beans>
yaraiza
Member II

Re: Extractor de metadatos para MS Office

Hola a la Comunidad.

Finalmente resolví los detalles en el extractor para que recogiera los datos de los documentos y lo mostrara en la interfaz de Alfresco.

No fue necesarios cambiar el código fuente de Alfresco como escribí en el post anterior.

1. Debugeando el código note que el extractor no parseaba el documento utilizando la clase OfficeParser(), por lo que finalmente use la clase OOXMLParser().

protected Parser getParser() {
      // TODO Auto-generated method stub      
      return new OOXMLParser();
   }


public static ArrayList<String> SUPPORTED_MIMETYPES= buildSupportedMimetypes(new String[] {
         MimetypeMap.MIMETYPE_EXCEL,
         MimetypeMap.MIMETYPE_WORD,
         MimetypeMap.MIMETYPE_PPT}, new OOXMLParser());


2. Utilizando los consejos de otos post cree una regla de negocio "extract common metadata" en el espacio de trabajo que se realizaría la extracción.