28/4/10

Convertir PDF a JPG en Java


Ahora presento un pequeño codigo para convertir documentos PDF a imagenes (*:JPG), para esta aplicacion, utilize las siguientes librerias:


- pdfbox-1.1.0 : Web: http://pdfbox.apache.org/download.html
- fontbox-1.1.0: La misma que la de arriba, solo hay que fijarse bien
- commons-logging-1.1.1 : Web: - http://commons.apache.org/logging/download_logging.cgi

Para continuar y ejecutar este proyecto, necesitas descargar esas librerias e instalarlas en Netbeans o en el IDe que utilices para programar, para instalar nuevas librerias a Netbeans, clic aqui.

Proyecto: Esta dividido en dos metodos y se ejecuta desde consola

Primer metodo: Este metodo convierte cada hoja del archivo PDF en imagenes con el formato JPG, recibe como parametro de entrada el "path" o sea la ruta de donde leera el archivo PDF, ejemplo: "e:/temppdf/", el segundo parametro es el "pdf", el nombre del archivo a convertir, ej: "Basilea.pdf".


/* Convierte el documento PDF a imagen con un tamaño grande*/
    public void Convertir_1(String path, String pdf){
    try {     
        PDDocument document = null;
        //se carga el documento
        document = PDDocument.load(new File(path + pdf));
        //se obtiene el numero de paginas del PDF
        int numero_paginas = document.getNumberOfPages();
        System.out.println("texto: " + document.getNumberOfPages());
        //Se capturan todas las paginas
        List pages = document.getDocumentCatalog().getAllPages();
        //un ciclo repetitivo para crear todas las imagenes
        for(int i=0; i<=numero_paginas-1;i++){
            System.out.println( "creando imagen - " + i);
            //se obtiene la pagina "i" de n paginas
            PDPage page = (PDPage)pages.get( i );
            //se convierte la hoja pdf a imagen y se coloca en memoria
            BufferedImage image = page.convertToImage();
            // se escribe a imagen en disco
            ImageIO.write(image, "jpg", new File( path + "tmp_" + i + ".jpg"));
            System.out.println( "imagen [" + i + "] creada");
        }
        document.close();//cerramos el pdf
    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }  
    }
Este metodo guarda las imagenes convertidas en la misma carpeta donde esta el PDF, lee la cantidad de paginas que tiene el archivo y utilizando un ciclo FOR, va convirtiendo y guardando pagina por pagina, este metodo crea las imagenes de un tamaño grande

Segundo metodo: Este metodo convierte cada hoja del archivo PDF en imagenes con el formato JPG, pero antes obtiene el tamaño de la hoja del archivo PDF y "escala" la imagen capturada por el API,  recibe como parametro de entrada el "path" o sea la ruta de donde leera el archivo PDF, ejemplo: "e:/temppdf/", el segundo parametro es el "pdf", el nombre del archivo a convertir, ej: "Basilea.pdf".



/* Convierte el documento PDF a Imagen, escalando el archivo al
      tamaño de las hojas del PDF*/
    public void Convertir_2(String path, String pdf){
    try {
        PDDocument document = null;
        //se carga el documento
        document = PDDocument.load(new File(path + pdf));
        //se obtiene el numero de paginas del PDF
        int numero_paginas = document.getNumberOfPages();
        System.out.println("texto: " + document.getNumberOfPages());  
        //Se capturan todas las paginas
        List pages = document.getDocumentCatalog().getAllPages();
        //un ciclo repetitivo para crear todas las imagenes
        for(int i=0; i<=numero_paginas-1;i++){
            System.out.println( "creando imagen - " + i);
            //se obtiene la pagina "i" de n paginas
            PDPage page = (PDPage)pages.get( i );
            //se convierte la hoja pdf a imagen y se coloca en memoria
            BufferedImage image = page.convertToImage();
            //ancho y alto de la pagina pdf
            int w = (int) document.getPageFormat(i).getWidth();
            int h = (int) document.getPageFormat(i).getHeight();
            //se crea una nueva imagen en memoria con el tamaño de la hoja pdf
            BufferedImage escala = new BufferedImage(w,h, BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics2D = escala.createGraphics(); 
            graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
            //se añade la imagen
            graphics2D.drawImage(image, 0, 0, w, h, null);
            // se escribe a imagen en disco
            ImageIO.write(escala, "jpg", new File( path + "tmp_e" + i + ".jpg"));
            System.out.println( "imagen [" + i + "] creada");
        }
        document.close();//cerramos el pdf
    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }  
    }

Al  igual que el primer metodo, utiliza un ciclo FOR para recorrer todo el documento.

Con unos cuantos cambios al codigo, puede convertirse el archivo PDF a cualquier tamaño, por ejemplo:


El codigo mas ejemplos en el siguiente enlace
Click para descargar

7 comentarios:

  1. jc, no puedo darte una opinion,por que el link no funciona. Sin embargo lo redactaré, y despues te cuento.

    ResponderEliminar
  2. Te recomiendo usar como servidor de archivos "Google Sites" puesto a los archivos son bastante pequeños.

    Saludos

    Excelentes aportes

    ResponderEliminar
  3. Como se hace para que no se pierda la calida de imagen?, usando el metodo que indicas no salen las imagenes en colores reales :S
    gracias !

    ResponderEliminar
  4. me convierte a jpg pero las letras no las reconoce: alguna idea? este es el codigo:


    org.apache.pdfbox.util.PDFStreamEngine processOperator
    INFO: unsupported/disabled operation: i
    Jul 26, 2011 3:41:35 PM org.apache.pdfbox.util.PDFStreamEngine processOperator
    WARNING: java.lang.ArrayIndexOutOfBoundsException: 6
    java.lang.ArrayIndexOutOfBoundsException: 6
    at org.apache.fontbox.cff.IndexData.getBytes(IndexData.java:43)
    at org.apache.fontbox.cff.CFFParser.readString(CFFParser.java:502)
    at org.apache.fontbox.cff.CFFParser.readFormat2Charset(CFFParser.java:878)
    at org.apache.fontbox.cff.CFFParser.readCharset(CFFParser.java:816)
    at org.apache.fontbox.cff.CFFParser.parseFont(CFFParser.java:336)
    at org.apache.fontbox.cff.CFFParser.parse(CFFParser.java:71)
    at org.apache.pdfbox.pdmodel.font.PDType1CFont.load(PDType1CFont.java:313)
    at org.apache.pdfbox.pdmodel.font.PDType1CFont.(PDType1CFont.java:104)
    at org.apache.pdfbox.pdmodel.font.PDCIDFontType0Font.getawtFont(PDCIDFontType0Font.java:69)
    at org.apache.pdfbox.pdmodel.font.PDType0Font.getawtFont(PDType0Font.java:89)
    at org.apache.pdfbox.pdmodel.font.PDSimpleFont.drawString(PDSimpleFont.java:101)
    at org.apache.pdfbox.pdfviewer.PageDrawer.processTextPosition(PageDrawer.java:194)
    at org.apache.pdfbox.util.PDFStreamEngine.processEncodedText(PDFStreamEngine.java:494)
    at org.apache.pdfbox.util.operator.ShowText.process(ShowText.java:45)
    at org.apache.pdfbox.util.PDFStreamEngine.processOperator(PDFStreamEngine.java:551)
    at org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:274)
    at org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:251)
    at org.apache.pdfbox.util.PDFStreamEngine.processStream(PDFStreamEngine.java:225)
    at org.apache.pdfbox.pdfviewer.PageDrawer.drawPage(PageDrawer.java:107)
    at org.apache.pdfbox.pdmodel.PDPage.convertToImage(PDPage.java:722)
    at javaapplication8.Main.main(Main.java:86)

    ResponderEliminar
  5. buenas, muy bueno el trabajo, aunque tengo el mismo problema que BJ Ramirez, algunos archivos me los convierte a la perfeccion, pero otros me convierte las letras originales a otras, y en otros casos me genera jpg con los colores invertidos y sin letras (las imagenes[fotos o dibujos] de los slides estan perfectas, pero las palabras desaparecen)

    saludos, si tienen alguna solucion agradeceria que la publicasen

    ResponderEliminar
  6. Hola a mi tambien me pasa lo mismo, estoy trabajando con fontbox-1.6.0, por favor alguien que nos ayude

    ResponderEliminar
  7. No se puede de alguna forma hacer el proceso inverso?

    ResponderEliminar