[Alfresco] Extractor de metadatos, Apache Tika y Alfresco 3.4e

Hola!

Escribo aquí animada por Cris… siempre digo que debería escribir un libro con las cosas que me pasan con Alfresco… y hoy es el momento de empezar!! jejeje

Bueno, comentar que llevo casi un año y medio programando con Alfresco… empezamos con la versión 3.1.1 y ha llegado el momento de migrar a la 3.4.

Llevamos utilizando desde el primer momento un extractor de PDF que nos extrae los datos que vienen en los keywords.

Hacemos esto porque nos llegan documentos de los que necesitamos extraer cierta información, la cual nos llega de la siguiente manera:

Keywords: CODIGO=12345;NUM_FACTURA=123xxx....

Para esto, desarrollamos un custom extractor :

public class PDFCustomExtractor extends AbstractMappingMetadataExtracter

Que soporte el mimetype PDF

private static final String KEY_KEYWORDS = "keywords";
 public static String[] SUPPORTED_MIMETYPES = { MimetypeMap.MIMETYPE_PDF };
public PDFCustomExtractor()
{
super(new HashSet<String>(Arrays.asList(SUPPORTED_MIMETYPES)));
}

e implementamos lo siguiente en el método extractRaw:

public Map<String, Serializable> extractRaw(ContentReader reader)  throws Throwable
{
 Map<String, Serializable> rawProperties = newRawMap();
 PDDocument pdf = null;
 InputStream is = null;
 try
 {
 is = reader.getContentInputStream();

 pdf = PDDocument.load(is);
 if (pdf.isEncrypted()) {
 //break label337;
 }
 PDDocumentInformation docInfo = pdf.getDocumentInformation();

 putRawValue("author", docInfo.getAuthor(), rawProperties);
 putRawValue("title", docInfo.getTitle(), rawProperties);
 putRawValue("subject", docInfo.getSubject(), rawProperties);

 String keywords = docInfo.getKeywords();
 try
 {
 keywords = keywords.trim();
 while (keywords.charAt(0) == '"') {
 keywords = keywords.substring(1);
 }
 while (keywords.charAt(keywords.length() - 1) == '"') {
 keywords = keywords.substring(0, keywords.length() - 1);
 }
 keywords = keywords.trim();

 StringTokenizer stcomma = new StringTokenizer(keywords, ";");
 while (stcomma.hasMoreTokens()) {
 String token = stcomma.nextToken();
 StringTokenizer sttoken = new StringTokenizer(token, "=");

 putRawValue(sttoken.nextToken(), sttoken.nextToken(), rawProperties);
 }
 }
 catch (Exception x) {
 log.error("Error en extractor PDF");
 }

 if (keywords != null) {
 putRawValue("keywords", keywords, rawProperties);
 }

 try
 {
 Calendar created = docInfo.getCreationDate();
 label337: if (created != null)
 {
 putRawValue("created", created.getTime(), rawProperties);
 }

 }
 catch (IOException localIOException)
 {
 }

 }
 finally
 {
 if (is != null)
 try {
 is.close(); } catch (IOException localIOException1) {
 }
 if (pdf != null) {
 try {
 pdf.close(); } catch (Throwable e) { e.printStackTrace(); }

 }
 }

 return rawProperties;
 }
}

Hasta aquí, todo genial…. el problema ha llegado cuando hemos migrado a la versión 3.4 y el extractor ha dejado de funcionar….

Después de estar todo el día intentando cambiarlo, creando uno nuevo… me da por mirar el que viene por defecto en Alfresco y me doy cuenta de que en esta nueva versión empiezan a usar Apache Tika …

Al final, he tenido que cambiar el código para adaptarlo al nuevo motor de extracción, y parece que de momento funciona bien…

Estos son los cambios más significativos que hemos realizado en el nuevo extractor:

public class PDFCustomExtractor  extends TikaPoweredMetadataExtracter

public static ArrayList<String> SUPPORTED_MIMETYPES = buildSupportedMimetypes(
             new String[] { MimetypeMap.MIMETYPE_PDF },
             new PDFParser()
    );

public PDFCustomExtractor()
{
    super(SUPPORTED_MIMETYPES);
}

Nuevo método:

    @Override
    protected Parser getParser() {
       return new PDFParser();
    }
   

Y sobreescribimos el extractRaw realizando la misma implementación que en el anterior

@Override
 public Map<String, Serializable> extractRaw(ContentReader reader) throws Throwable

Espero que a alguien le sirva de ayuda!!!

Deja un comentario