example ejemplo downloads create pdf pdfbox

ejemplo - PDFBox pdf a la imagen genera texto superpuesto



pdfbox merge pdf (1)

Para un proyecto paralelo, comencé a usar PDFBox para convertir archivos PDF a imágenes. Este es el archivo pdf que estoy usando para convertir el archivo de imagen https://bitcoin.org/bitcoin.pdf .

Este es el código que estoy usando. Es un código muy simple que llama a PDFToImage. Pero el archivo de imagen de salida jpg se ve muy mal con muchas comas insertadas y texto superpuesto.

String [] args_2 = new String[7]; String pdfPath = "C://bitcoin.pdf"; args_2[0] = "-startPage"; args_2[1] = "1"; args_2[2] = "-endPage"; args_2[3] = "1"; args_2[4] = "-outputPrefix"; args_2[5] = "my_image_2"; //args_2[6] = "-resolution"; //args_2[7] = "1000"; args_2[6] = pdfPath; try { PDFToImage.main(args_2); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }


Si miras las salidas de registro (quizás necesites activar el registro en tu entorno). verá muchas entradas como estas (generadas usando PDFBox 1.8.5):

Jun 16, 2014 8:40:43 AM org.apache.pdfbox.pdmodel.font.PDSimpleFont drawString Warnung: Changing font on <t> from <Century Schoolbook Fett> to the default font Jun 16, 2014 8:40:43 AM org.apache.pdfbox.pdmodel.font.PDSimpleFont drawString Warnung: Changing font on <S> from <Times New Roman> to the default font Jun 16, 2014 8:40:46 AM org.apache.pdfbox.pdmodel.font.PDSimpleFont drawString Warnung: Changing font on <c> from <Arial> to the default font Jun 16, 2014 8:40:52 AM org.apache.pdfbox.pdmodel.font.PDSimpleFont drawString Warnung: Changing font on <i> from <Courier New> to the default font

Así que PDFBox utiliza fuentes diferentes a las fuentes indicadas por el PDF para representar el texto. Esto explica tanto las muchas comas insertadas como el texto superpuesto :

  1. diferentes fuentes pueden tener diferentes codificaciones. Parece que el PDF de muestra usa una codificación que tiene una coma donde la fuente predeterminada asumida por PDFBox tiene un carácter de espacio;
  2. diferentes fuentes tienen diferentes anchuras de glifo. En su PDF de muestra, los diferentes anchos de glifo causan la superposición de texto.

Esto resulta en

La razón de todo esto es que PDFBox 1.8.x no admite todos los tipos de fuentes para el procesamiento. Es posible que desee probar PDFBox 2.0.0-SNAPSHOT, el nuevo PDFBox actualmente en desarrollo, en su lugar. Tenga en cuenta, sin embargo, que las clases para renderizar han sido cambiadas.

Usando PDFBox 2.0.0-SNAPSHOT

Usando el estado actual (mediados de junio de 2014) de PDFBox 2.0.0-SNAPSHOT, puede generar archivos PDF de esta manera:

PDDocument document = PDDocument.loadNonSeq(resource, null); PDDocumentCatalog catalog = document.getDocumentCatalog(); @SuppressWarnings("unchecked") List<PDPage> pages = catalog.getAllPages(); PDFRenderer renderer = new PDFRenderer(document); for (int i = 0; i < pages.size(); i++) { BufferedImage image = renderer.renderImage(i); ImageIO.write(image, "png", new File("bitcoin-convertToImage-" + i + ".png")); }

El resultado con este código es:

Otras sobrecargas PDFRenderer.renderImage permiten establecer explícitamente la resolución deseada.

PD: según lo propuesto por Tilman Hausherr, es posible que desee reemplazar la llamada ImageIO.write por

ImageIOUtil.writeImage(image, "bitcoin-convertToImage-" + i + ".png", 72);

ImageIOUtil es una clase auxiliar PDFBox que intenta optimizar la selección de la ImageIOUtil ImageIO y agregar un atributo DPI al archivo de imagen.

Si utiliza una sobrecarga PDFRenderer.renderImage diferente para establecer una resolución, recuerde cambiar el parámetro final 72 aquí en consecuencia.