Aportación Java México - PCJ -Leer un PDF desde una url con PDFBox

Hace poco tiempo me tope con la necesidad de leer documentos pdf desde un servidor para obtener el texto y sus propiedades, por lo que tuve que investigar que apis permiten la manipulación de un pdf, me tope con un buen blog el cual te explica como hacerlo con PDFBox a mi parecer esta muy entendible y me sirvió para mi propósito, lo único que hice fue modificarlo un poco acorde a mis necesidades, el link del blog que mencione anteriormente es : http://noelia-java.blogspot.com/2009/07/leer-pdf-desde-java.html

Las clases que genere son las siguientes:

Para el modelo donde se almacenara la información del pdf:

/**
 *
 * @author sakura
 */

public class EntidadPDF {
        private String titulo;
                private String autor;
                private int numeroDePaginas;
                private String tema;
                private String palabrasClave;
                private String creador;
                private String productor;
                private String contenido;//el contenido completo del documento

    public String getAutor() {
        return autor;
    }

    public void setAutor(String autor) {
        this.autor = autor;
    }

    public String getContenido() {
        return contenido;
    }

    public void setContenido(String contenido) {
        this.contenido = contenido;
    }

    public String getCreador() {
        return creador;
    }

    public void setCreador(String creador) {
        this.creador = creador;
    }

    public int getNumeroDePaginas() {
        return numeroDePaginas;
    }

    public void setNumeroDePaginas(int numeroDePaginas) {
        this.numeroDePaginas = numeroDePaginas;
    }

    public String getPalabrasClave() {
        return palabrasClave;
    }

    public void setPalabrasClave(String palabrasClave) {
        this.palabrasClave = palabrasClave;
    }

    public String getProductor() {
        return productor;
    }

    public void setProductor(String productor) {
        this.productor = productor;
    }

    public String getTema() {
        return tema;
    }

    public void setTema(String tema) {
        this.tema = tema;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

}

El método que leera el pdf dada una url esta contenido en la siguiente clase

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.pdfbox.pdfparser.PDFParser;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.pdmodel.PDDocumentInformation;
import org.pdfbox.util.PDFTextStripper;

/**
 *
 * @author sakura
 */

public class ContenedorPDF {

    private FileInputStream file = null;
    private PDDocument document = null;

    /**
     * Abre el archivo especificado en la ruta para generar un objeto de tipo EntidadPDF
     * @param archivo
     * @return
     */

    public EntidadPDF convertirAModelo(String archivo)  {
        EntidadPDF entPdf = new EntidadPDF();
        try {

            //leemos el pdf dada una url
            URL url = new URL(archivo);
            InputStream is = url.openStream();

            PDFParser parser = new PDFParser(is);

            parser.parse();
            document = parser.getPDDocument();

            //Obtenemos todo el contenido del pdf
            PDFTextStripper stripper = new PDFTextStripper();
            entPdf.setContenido(stripper.getText(document));

            //obtenemos la informacion de las propiedades del pdf
            PDDocumentInformation info = document.getDocumentInformation();

            entPdf.setTitulo(info.getTitle());
            entPdf.setAutor(info.getAuthor());
            entPdf.setNumeroDePaginas(document.getNumberOfPages());
            entPdf.setTema(info.getSubject());
            entPdf.setPalabrasClave(info.getKeywords());
            entPdf.setCreador(info.getCreator());
            entPdf.setProductor(info.getProducer());

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {//no se pudo abrir el archivo
            e.printStackTrace();
        } finally {
            if (file != null) {
                try {
                    file.close();
                } catch (IOException e) {//no se pudo cerrar el archivo
                    e.printStackTrace();
                }
            }
            if (document != null) {
                try {
                    document.close();
                } catch (IOException e) {//no se pudo cerrar el documento
                    e.printStackTrace();
                }
            }
        }

        return entPdf;
    }

}

Bien espero y le sea de ayuda, una vez que tenemos el texto del pdf como String podemos ocupar esta información para diferentes propósitos, les dejo otro link de otras apis que permiten la manipulación de un pdf
http://www.qoppa.com/

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

error al implementar

sakura, he copiado tu codigo creo un clase de prueba pero, me genera un error. Espero me puedas guiar que en donde lo estoy haciendo mal, ya que tambien necesito sacar el texto de un pdf. agrego el codigo que hice y el error que me lanza.

public class test {
    public static void main(String[] args) {
        ContenedorPDF pdf=new ContenedorPDF();
        EntidadPDF archivo;
        archivo=pdf.convertirAModelo("http://www.uv.es/ivorra/Latex/LaTeX.pdf");
        System.out.println(archivo.getAutor());
    }
}

error

run:
Exception in thread "main" java.lang.NoClassDefFoundError: org/fontbox/cmap/CMapParser
        at org.pdfbox.pdmodel.font.PDFont.parseCmap(PDFont.java:534)
        at org.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:387)
        at org.pdfbox.util.PDFStreamEngine.showString(PDFStreamEngine.java:325)
        at org.pdfbox.util.operator.ShowText.process(ShowText.java:64)
        at org.pdfbox.util.PDFStreamEngine.processOperator(PDFStreamEngine.java:452)
        at org.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:215)
        at org.pdfbox.util.PDFStreamEngine.processStream(PDFStreamEngine.java:174)
        at org.pdfbox.util.PDFTextStripper.processPage(PDFTextStripper.java:336)
        at org.pdfbox.util.PDFTextStripper.processPages(PDFTextStripper.java:259)
        at org.pdfbox.util.PDFTextStripper.writeText(PDFTextStripper.java:216)
        at org.pdfbox.util.PDFTextStripper.getText(PDFTextStripper.java:149)
        at nuevo.ContenedorPDF.convertirAModelo(ContenedorPDF.java:30)
        at nuevo.test.main(test.java:6)
Caused by: java.lang.ClassNotFoundException: org.fontbox.cmap.CMapParser
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        ... 13 more
Java Result: 1
GENERACIÓN CORRECTA (total time: 4 seconds)

saludos y ojala y me puedas ayudar

Imagen de neko069

Pues no soy Sakura, pero te

Pues no soy Sakura, pero te falta agregar un jar, el fontbox, que debería de venir junto con el pdfBox....

a mi me sucede lo mismo

A mi me sucede lo mismo que a ripr me da el mismo error, con el comentario que puso neko069 descargue el .jar

fontbox

y lo agregue como una librería a mi proyecto pero me sigue dando el mismo error, si alguien me pudiera ayudar se lo agradecería mucho. salu2

Imagen de neko069

Pues revisé el nombre de la

Pues revisé el nombre de la clase en la página de findjar, y sólo el jar de fontbox (y otra de rabbit) incluye ésa clase, así que por el lado de la biblioteca en sí, no es, si estás trabajando con algún IDE; asegúrate que esté configurada la bilbioteca, es decir, que el IDE la incluya a la hora de compilar, no sólo es copiar/pegar el jar, si estás compilando por consola, asegúrate que estés incluyendo el nombre de la biblioteca en el parámeto de cp.