Convertir PDF a imagen (con un formato adecuado)

tengo un archivo pdf (adjunto). Mi objetivo es convertir un pdf a una imagen usando pdfbox COMO ES, (igual que usar la herramienta de corte en ventanas). El pdf tiene todo tipo de formas y texto.

Estoy usando el siguiente código:

PDDocument doc = PDDocument.load("Hello World.pdf"); PDPage firstPage = (PDPage) doc.getDocumentCatalog().getAllPages().get(67); BufferedImage bufferedImage = firstPage.convertToImage(imageType,screenResolution); ImageIO.write(bufferedImage, "png",new File("out.png")); 

Este es el PDF que quiero convertir

cuando uso el código, el archivo de imagen da salidas totalmente erróneas (out.png adjunto) Este es el archivo de imagen convertido de pdfbox

¿Cómo hago pdfbox tomar algo como una imagen de instantánea directa?

también, me di cuenta de que la calidad de imagen del png no es tan bueno, hay alguna manera de aumentar la resolución de la imagen generada?

EDIT: aquí está el pdf (ver página número 68) https://drive.google.com/file/d/0B0ZiP71EQHz2NVZUcElvbFNreEU/edit?usp=sharing

EDIT 2: parece que todo el texto está saliendo. También intenté usar la clase PDFImageWriter

 test.writeImage(doc, "png", null, 68, 69, "final.png",TYPE_USHORT_GRAY,200 ); 

mismo resultado

    3 Solutions collect form web for “Convertir PDF a imagen (con un formato adecuado)”

    Utilizando PDFRenderer es posible convertir la página PDF en formatos de imagen.

    Convertir la página PDF en imagen en java Uso de PDF Renderer. Tarros Requeridos PDFRenderer-0.9.0

     package com.pdfrenderer.examples; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import javax.imageio.ImageIO; import com.sun.pdfview.PDFFile; import com.sun.pdfview.PDFPage; public class PdfToImage { public static void main(String[] args) { try { String sourceDir = "C:/Documents/Chemistry.pdf";// PDF file must be placed in DataGet folder String destinationDir = "C:/Documents/Converted/";//Converted PDF page saved in this folder File sourceFile = new File(sourceDir); File destinationFile = new File(destinationDir); String fileName = sourceFile.getName().replace(".pdf", "_cover"); if (sourceFile.exists()) { if (!destinationFile.exists()) { destinationFile.mkdir(); System.out.println("Folder created in: "+ destinationFile.getCanonicalPath()); } RandomAccessFile raf = new RandomAccessFile(sourceFile, "r"); FileChannel channel = raf.getChannel(); ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); PDFFile pdf = new PDFFile(buf); int pageNumber = 62;// which PDF page to be convert PDFPage page = pdf.getPage(pageNumber); System.out.println("Total pages:"+ pdf.getNumPages()); // create the image Rectangle rect = new Rectangle(0, 0, (int) page.getBBox().getWidth(), (int) page.getBBox().getHeight()); BufferedImage bufferedImage = new BufferedImage(rect.width, rect.height, BufferedImage.TYPE_INT_RGB); // width & height, // clip rect, // null for the ImageObserver, // fill background with white, // block until drawing is done Image image = page.getImage(rect.width, rect.height, rect, null, true, true ); Graphics2D bufImageGraphics = bufferedImage.createGraphics(); bufImageGraphics.drawImage(image, 0, 0, null); File imageFile = new File( destinationDir + fileName +"_"+ pageNumber +".png" );// change file format here. Ex: .png, .jpg, .jpeg, .gif, .bmp ImageIO.write(bufferedImage, "png", imageFile); System.out.println(imageFile.getName() +" File created in: "+ destinationFile.getCanonicalPath()); } else { System.err.println(sourceFile.getName() +" File not exists"); } } catch (Exception e) { e.printStackTrace(); } } } 

    ConvertedImage:

    Chemistry_cover_62

    Tengo el mismo resultado que el OP usando PDFBox versión 1.8.4. En la versión 2.0.0-SNAPSHOT, sin embargo, se ve mejor:

    introduzca la descripción de la imagen aquí

    Aquí sólo algunas flechas son más delgadas y algunas partes de flechas son erróneas como cajas.

    Así,

    ¿Cómo hago pdfbox tomar algo como una imagen de instantánea directa?

    Las versiones de lanzamiento actuales (hasta 1.8.4) parecen tener mayores déficits al procesar PDFs como imágenes. Puede cambiar a una versión de desarrollo actual (por ejemplo, el tronco actual, 2.0.0-SNAPSHOT) o esperar hasta que se publiquen las mejoras.

    Además, algunos déficits menores son incluso en 2.0.0-SNAPSHOT. Es posible que desee presentar su documento de ejemplo a la gente PDFBox (es decir, crear un problema de acuerdo en su JIRA) para que mejoren aún más PDFBox para satisfacer sus necesidades.

    también, me di cuenta de que la calidad de imagen del png no es tan bueno, hay alguna manera de aumentar la resolución de la imagen generada?

    Hay sobrecargas convertToImage con parámetros de resolution . Su código actual establece realmente la resolución a screenResolution . Aumente este valor de resolución.

    PS: El código para procesar una página PDF a imagen ha sido refactorizado en 2.0.0-SNAPSHOT. En lugar de

     BufferedImage image = page.convertToImage(); 

    ahora lo haces

     BufferedImage image = RenderUtil.convertToImage(page); 

    Supongo que esto se ha hecho para eliminar las referencias AWT directas de las clases básicas porque AWT no está disponible en, por ejemplo, Android.


    PS : El SNAPSHOT que usé el año pasado en esta respuesta fue simplemente una instantánea sujeta a cambios. La versión 2.0.0 todavía está en desarrollo, muchas cosas han cambiado. Especialmente ya no RenderUtil clase RenderUtil . En lugar de uno actualmente tiene que utilizar el PDFRenderer en el paquete org.apache.pdfbox.rendering

    resulta que jpedal (lgpl) hace la conversión perfectamente (al igual que una instantánea).

    aquí es lo que he usado:

     PdfDecoder decode_pdf = new PdfDecoder(true); FontMappings.setFontReplacements(); decode_pdf.openPdfFile("Hello World.pdf"); decode_pdf.setExtractionMode(0,800,3); try { for(int i=0;i<40;i++) { BufferedImage img=decode_pdf.getPageAsImage(2+i); ImageIO.write(img, "png",new File(String.valueOf(i)+"out.png")); } } catch (IOException ex) { Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex); } decode_pdf.closePdfFile(); } catch (PdfException e) { e.printStackTrace(); } 

    funciona bien.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.