some image

Codes and Tags

Extraer contenido de un archivo epub

Etiquetas: , Blog, Programación No comments

Estos días tuve el reto de leer el contenido de un archivo .epub para extraer su contenido y exportarlo en un archivo plano (de texto). Al principio estaba haciendo todo a mano, pero me dí cuenta que estaba reinventando la rueda. Así que en este POST colocaré un ejemplo del cómo lo hice utilizando una libreria super útil.

La librería que utilice pertenece a Paul Siegmann, y me ha parecido suuper util :) . Aquí dejo el link de las fuentes que utilice :

http://www.siegmann.nl/epublib
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=epubLib

Codigo

package org.codesandtags.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Reader;
import java.text.MessageFormat;

import nl.siegmann.epublib.domain.Book;
import nl.siegmann.epublib.domain.Resource;
import nl.siegmann.epublib.epub.EpubReader;

  
/**
 * Clase que se encarga de la lectura de un archivo epub,
 * obtiene el contenido, elimina las etiquetas y caracteres no alfabeticos
 * e imprime su contenido en un archivo con el mismo nombre del epub
 * con extension .txt
 * 
 * @author Hunter
 *
 */
public class LectorEpub {
	
	private EpubReader 			epubReader;
	private Book 				book;
	private FileInputStream 	archivoEntrada;
	private PrintWriter 		archivoSalida;
	private boolean 			informacionAdicional 	= false;
	private final String 		REGEXP_HTML 			= "<[^>]*>";	//Tags de HTML
	private final String 		REGEXP_PERMITIDOS		= "[^a-zA-ZñÑáéíóúÁÉÍÓÚ ]"; //Caracteres permitidos
	
	
	public LectorEpub(String rutaArchivo, boolean informacionAdicional) {
		
		try {
			this.informacionAdicional = informacionAdicional;
			archivoEntrada 	= new FileInputStream(rutaArchivo);
			archivoSalida 	= new PrintWriter(new File(rutaArchivo + ".txt"));
			leerLibro();
		} catch (FileNotFoundException e) {
			System.err.println(MessageFormat.format("ERROR : Archivo no encontrado [{0}]", rutaArchivo));
			e.printStackTrace();
		}
		
	}
	
	/**
	 * Metodo que hace la magia 
	 */
	public void leerLibro(){
		
		try{
			epubReader = new EpubReader();
			book = epubReader.readEpub(archivoEntrada);
			
			if(informacionAdicional){
				// Datos del Epub				
				String titulo	= book.getMetadata().getFirstTitle();
				String autor	= book.getMetadata().getAuthors().get(0).toString();
				String lenguaje = book.getMetadata().getLanguage();
				String descripcion = removerHTML(book.getMetadata().getDescriptions().get(0));
				
				System.out.println(MessageFormat.format("Titulo      : {0}", titulo));
				System.out.println(MessageFormat.format("Autor       : {0}", autor));
				System.out.println(MessageFormat.format("Lenguaje    : {0}", lenguaje));
				System.out.println(MessageFormat.format("Descripcion : {0}", descripcion));
			}
			
			// Lectura del contenido del Epub
			int index = 0;
			for(Resource contenido : book.getTableOfContents().getAllUniqueResources()){
				
				//System.out.println(contenido.getId());
				
				Reader readerContenido = contenido.getReader();
				// Crea un arreglo con el tamano de caracteres a leer
				char[] bufferContenido = new char[(int)contenido.getSize()];
				// Lee el contenido y lo guarda en el arreglo
				readerContenido.read(bufferContenido);
				// Se obtiene el arreglo de caracteres y se conviernte a una cadena String
				String textoContenido = String.valueOf(bufferContenido);
				// Se remueven los caracteres no necesarios y se imprime el contenido del archivo
				archivoSalida.print(removerHTML(textoContenido));

				index++;
			}
			
			// Vuelca el contenido en el archivo y lo cierra
			archivoSalida.flush();
			archivoSalida.close();
			
		}catch(IOException e){
			System.err.println("ERROR : Ocurrio una excepcion leyendo el archivo");
			e.printStackTrace();
		}
	}
	
	/**
	 * Toma una cadena de texto y elimina los tags html que pueden ser
	 * , ,  o 
	 * @param texto
	 * @return
	 */
	public String removerHTML(String texto){
		texto = texto.replaceAll(REGEXP_HTML, "");
		texto = texto.replaceAll(REGEXP_PERMITIDOS, "");
		return texto;
	}
	
	
	
	public static void main(String[] args) {

		long tinicial = System.currentTimeMillis();
		System.out.println("Empezando procesamiento...");
		
		File directorioEpubs = new File("C:\\Hunter\\Ebooks\\");
		int archivosProcesados = 0;
		
		for(File epub : directorioEpubs.listFiles()){
			
			if(epub.getName().endsWith(".epub")){
				System.out.println("Procesando > " + epub.getAbsolutePath());
				LectorEpub lector = new LectorEpub(epub.getAbsolutePath(), false);
				archivosProcesados++;
			}
		}
		
		System.out.println("Total de epubs procesados : " + archivosProcesados);

		long tfinal = System.currentTimeMillis();
		System.out.println("Ejecucion terminada en : " + (tfinal - tinicial) + " ms.");
	}

}

Ejemplo de Salida

Empezando procesamiento...
Procesando > C:\Hunter\Ebooks\En Busca de Klingsor - Jorge Volpi.epub
Procesando > C:\Hunter\Ebooks\La chica que sonaba con una cerilla y un - Stieg Larsson.epub
Procesando > C:\Hunter\Ebooks\Las hormigas - Bernard Werber.epub
Total de epubs procesados : 3
Ejecucion terminada en : 1172 ms.

About Edwin Torres

Related Posts

  • Logo Java
  • Logo Java
  • Logo Java
  • Logo Java

Add your comment