cancel
Showing results for 
Search instead for 
Did you mean: 

Extractor de metadatos para MS Office

yaraiza
Champ in-the-making
Champ in-the-making
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 5

cristinamr
World-Class Innovator
World-Class Innovator
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
Champ in-the-making
Champ in-the-making
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
World-Class Innovator
World-Class Innovator
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
Champ in-the-making
Champ in-the-making
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
Champ in-the-making
Champ in-the-making
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.

Welcome to the new Hyland Connect. Get started or submit feedback.