2012-07-10 1019 views
8

Estoy tratando de insertar imágenes dentro de un PDF, pero la calidad hace que las imágenes sean ilegibles. ¿Cómo se puede mejorar la calidad del documento PDF final?PDFBox imagen borrosa cuando se inserta en pdf en Java

He intentado otras librerías libres de licencias GPL y creo que pdfbox es el mejor, así que me gustaría poder usar el pdfbox.

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

import org.apache.pdfbox.exceptions.COSVisitorException; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream; 
import org.apache.pdfbox.pdmodel.font.PDFont; 
import org.apache.pdfbox.pdmodel.font.PDType1Font; 
import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg; 
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage; 


public class pdfBoxTest { 


    public static void WritteBufferedImageToPDF(BufferedImage buff) 
    { 

     PDDocument doc = null; 
     PDPage page = null; 
     PDXObjectImage ximage = null; 
     try { 
      doc = new PDDocument(); 
      page = new PDPage(); 
      doc.addPage(page); 

      ximage = new PDJpeg(doc, buff, 1.0f); 

      PDPageContentStream content = new PDPageContentStream(doc, page); 


      content.drawImage(ximage, 0, 0); 
      content.close(); 
      doc.save("C:/Users/crusader/Desktop/Hello World.pdf"); 
      doc.close(); 

     } 
     catch (IOException ie){ 
      ie.printStackTrace(); 
      //handle exception 
     } 
     //save and close 
catch (COSVisitorException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
    public static void main(String []args) 
    { 
     BufferedImage buff= null; 

     try{ 

      buff = ImageIO.read(new File("C:/Users/crusader/Desktop","tests.jpg")); 

     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 

     System.out.println(buff.getWidth()); 
     System.out.println(buff.getHeight()); 
     pdfBoxTest.WritteBufferedImageToPDF(buff); 
    } 
} 
+0

El problema se deriva de PDFBox sólo ser capaz de utilizar JPEG como formato de imagen para las imágenes en el documento, que es un formato con pérdida. No he encontrado una solución adecuada todavía. – iddo

+1

@iddo: prueba PDPixelMap en la última versión – Gilead

+0

@Crusader: He intentado con tu código y está funcionando bien, pero solo obtengo la mitad del contenido de la página (en cuanto a ancho) en el documento pdf. ¿Podrías ayudarme con eso? –

Respuesta

5

sé un truco que puede ayudar a aumentar la calidad en algunos escenarios con PDFBox, que es a escala de la imagen (ya sé que no es una solución muy inteligente, aumenta el uso de la CPU, tamaño de archivo ... pero funciona).

public class PdfBoxTest { 

    public static void WritteBufferedImageToPDF(BufferedImage buff, int width, int height) 
    { 

     PDDocument doc = null; 
     PDPage page = null; 
     PDXObjectImage ximage = null; 
     try { 
      doc = new PDDocument(); 
      page = new PDPage(); 
      doc.addPage(page); 

      ximage = new PDJpeg(doc, buff, 1.0f); 

      PDPageContentStream content = new PDPageContentStream(doc, page); 

      content.drawXObject(ximage, 0, 0, width, height); 
      content.close(); 
      doc.save("C:/Users/crusader/DesktopHello World.pdf"); 
      doc.close(); 

     } 
     catch (IOException ie){ 
      ie.printStackTrace(); 
      //handle exception 
     } 
     //save and close 
     catch (COSVisitorException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    private static final int SCALE_FACTOR = 3;//increases file size and quality 

    public static void main(String []args) 
    { 
     BufferedImage buff= null; 
     BufferedImage resized = null; 
     try{ 
      buff = ImageIO.read(new File("C:/Users/crusader/Desktop","tests.jpg")); 
      resized = new BufferedImage(buff.getWidth()*SCALE_FACTOR, buff.getHeight()*SCALE_FACTOR, buff.getType()); 
      Graphics2D g = resized.createGraphics(); 
      g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
      g.drawImage(buff, 0, 0, resized.getWidth(), resized.getHeight(), 0, 0, buff.getWidth(), buff.getHeight(), null); 
      g.dispose();   
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 

     System.out.println(buff.getWidth()); 
     System.out.println(buff.getHeight()); 

     PdfBoxTest.WritteBufferedImageToPDF(resized, buff.getWidth(), buff.getHeight()); 
    } 
} 

* Por favor, hágamelo saber si esto ha sido de alguna manera útil

+0

He intentado con tu código y está funcionando bien, pero solo estoy obteniendo la mitad del contenido de la página (en cuanto a ancho) en el documento pdf. ¿Podrías ayudarme con eso? –

+0

Multiplicar ancho y alto con 0.5f en content.drawXObject() llamada. –

Cuestiones relacionadas