Capturar webcam con VB.NET

¿Que haremos? Crearemos una aplicación en Visual Studio, la cual hará uso de una webcam para capturar el video en frames independientes y depositarlos en memoria para despues mostralos al usuario a través de un picturebox y un Timer para crear la ilusión de movimiento. ¿Porque lo haremos? Porque es justo y necesario ¿Que necesitamos? [...]

Envío de correo con JavaMail/Netbeans

JavaMail es una expansión de Java que facilita el envío y recepción de e-mail desde código java. JavaMail implementa el protocolo SMTP (Simple Mail Transfer Protocol) así como los distintos tipos de conexión con servidores de correo -TLS, SSL, autentificación con usuario y password, etc [Según SantaWikipedia] ¿Qué necesitamos? JavaMail 1.4.5 Java y Netbeans 6.9 [...]

Proyecto de base de datos Firebird VB

En este proyecto realizaremos una aplicación de base de datos Firebird con el lenguaje de programación de Visual Basic de Microsoft, este proyecto tendrá las funciones básicas de gestión INSERT, DELETE, UPDATE y una interfaz de usuario para utilizarlas. ¿Que necesitamos? Visual Studio 2008 o superior Firebird última versión Firebird ADO.NET Data Provider. Conocimientos básicos [...]

Imprimir imagen con Print

La siguiente clase hace uso de PRINT para imprimir una imagen que se encuentra en un variable de tipo FileInputStream, esta clase a su vez es implementada desde una interfaz que hace fácil su uso, la clase así como todo el proyecto esta comentado. import java.io.File; import javax.print.Doc; import java.io.IOException; import javax.print.DocFlavor; import javax.print.SimpleDoc; import java.io.FileInputStream; [...]

Code Army Bolivia

28/4/10

Convertir PDF a JPG en Java

JAN29


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:

Anónimo dijo...

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

Edmond dijo...

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

Saludos

Excelentes aportes

Wilcor dijo...

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 !

BJ Ramirez dijo...

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)

Matias dijo...

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

Anónimo dijo...

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

Christian Lesmo dijo...

No se puede de alguna forma hacer el proceso inverso?

Post recomendado