2011-08-14 20 views
8

En mi proyecto actual, trato de agregar un BufferedImage a un documento PDFBox. Más específicamente, utilizo una imagen de JFreeChart. Mi código se ve así:Agregar BufferedImage al documento PDFBox

public void exportToPDF(JFreeChart chart, String filePath){ 
    PDDocument doc = null; 
    PDPage page = null; 
    PDXObjectImage ximage = null; 

    try { 
     doc = new PDDocument(); 
     page = new PDPage(); 
     doc.addPage(page); 
     PDPageContentStream content = new PDPageContentStream(doc, page); 
     BufferedImage image = chart.createBufferedImage(300, 300); 
     ximage = new PDJpeg(doc, image); 
     content.drawImage(ximage, 20, 20); 
     content.close(); 
    } catch(IOException ie) { 
    } 
    doc.save(filePath); 
    doc.close(); 
} 

Se crea el documento; Puedo agregar texto, pero aparece un error que indica que la imagen no tiene suficiente información para mostrarse.

¿Alguna pista de lo que estoy haciendo mal?

+0

¿Cuál es el error? – leonm

+0

El mensaje de error se muestra en el archivo pdf generado, debería haber sido claro al respecto. Cuando abro el archivo dislays todo el texto como debería, pero en lugar de una imagen recibo un mensaje "Datos insuficientes para mostrar la imagen". Soy más o menos ecológico cuando se trata de reproducir imágenes, por lo que cualquier idea es bienvenida – Oglop

+0

Esta podría ser esta falla: https://issues.apache.org/jira/browse/PDFBOX-2026 Se solucionará en 1.8.5. O descarga una instantánea. –

Respuesta

7

Gracias por ayudarme a salir trashgod. Pasé la noche pasada y unas pocas horas hoy confundiéndome con PipedIn/OutStreams. No puedo resolverlo. Sin embargo, lo tengo para trabajar. Resulta que no fue muy difícil en absoluto.

public void exportToPDF(JFreeChart chart, String filePath){ 
    PDDocument doc = null; 
    PDPage page = null; 
    PDXObjectImage ximage = null; 
    try { 
     doc = new PDDocument(); 
     page = new PDPage(); 
     doc.addPage(page); 
     PDPageContentStream content = new PDPageContentStream(doc, page); 

     //create a new outStream 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     ChartUtilities.writeChartAsJPEG(out, chart, 300, 300);//write to outstream 
     //create a new inputstream 
     InputStream in = new ByteArrayInputStream(out.toByteArray()); 
     ximage = new PDJpeg(doc, in); 
     content.drawImage(ximage, 5, 300); 
     content.close(); 
    } 
    catch (IOException ie){ 
     //handle exception 
    } 
    //save and close 
    doc.save(filePath); 
    doc.close(); 
} 

Estoy seguro de que esto se puede hacer mejor, pero funciona.

3

Dos cosas se destacan:

  • no tragan excepciones.

  • Utilice ChartUtilities para representar la imagen en un formato adecuado, como se sugiere here.

+0

Así que miré lo que dijiste, puedo obtener un outputStream usando: OutputStream out = new ByteArrayOutputStream(); y luego: ChartUtilities.writeChartAsJPEG (out, chart, 300, 300); sin embargo, no puedo entender cómo convertir esto en un flujo de entrada. – Oglop

+0

Para mover los datos de un 'OutputStream' a un' InputStream', use transmisiones canalizadas, que se muestran [aquí] (http://stackoverflow.com/questions/4443878/redirecting-system-out-to-jtextpane/4444677#4444677) y [aquí] (http://stackoverflow.com/questions/484119/why-doesnt-more-java-code-use-pipedinputstream-pipedoutputstream). – trashgod

+0

Además, puede guardar la imagen como un archivo o almacenar en caché su matriz de bytes. Considere también el 'PNG' v' JPG' [tradeoff] (http://www.turnkeylinux.org/blog/png-vs-jpg). – trashgod

5

hay una manera fácil de insertar un JFreeChart en un pdf con PDFBox:

BufferedImage bufferedImage = source.getChart().createBufferedImage(source.getWidth(), 
     source.getHeight(), BufferedImage.TYPE_INT_RGB, null); 
PDXObjectImage ximage = new PDJpeg(doc, bufferedImage); 

Sin ninguna corriente;)

+0

Esto parece ser lo que estaba buscando en ese momento. ¡Estupendo! – Oglop