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 grandeSegundo 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
7 comentarios:
jc, no puedo darte una opinion,por que el link no funciona. Sin embargo lo redactaré, y despues te cuento.
Te recomiendo usar como servidor de archivos "Google Sites" puesto a los archivos son bastante pequeños.
Saludos
Excelentes aportes
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 !
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)
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
Hola a mi tambien me pasa lo mismo, estoy trabajando con fontbox-1.6.0, por favor alguien que nos ayude
No se puede de alguna forma hacer el proceso inverso?
Publicar un comentario