PDFBox从BufferedImage中绘制黑色图像

时间:2014-10-23 01:30:03

标签: java bufferedimage pdfbox

我尝试使用PDFBox将bufferedImage中的图像绘制成PDF但是失败了,我得到了黑色图像,并且Acrobat Reader会发出错误,例如"内存不足" (但显示PDF)。

我使用bufferedImage,因为我需要绘制一个JavaFX Image对象(来自调用Funciones.crearImagenDesdeTexto(),是一个将文本转换为Image的函数)。其余图像在不使用bufferedimage的情况下运行良好。

    PDPixelMap img = null;
    BufferedImage bi;

    try {
        //If item has id, I try to get image with that id (image it's shows OK on PDF)
        img = new PDPixelMap(documento, read(getClass().getResourceAsStream("/com/img/" + item.getId() + ".png")));
    }
    catch (Exception e) {
        //If item has not id or fails load image, I create image on the fly (which contains item name. This not work on PDF, shows black images)
        bi = new BufferedImage(alto, ancho, BufferedImage.TYPE_INT_ARGB);
        bi.createGraphics().drawImage(SwingFXUtils.fromFXImage(Funciones.crearImagenDesdeTexto(item.getNombre()), null), ancho, alto, null);
        img = new PDPixelMap(documento, bi);
    }
    finally {
        contenedor.drawXObject(img, x, y, alto, ancho);
    }

注意:crearImagenDesdeTexto()返回一个动态创建的JavaFX图像对象(我在程序的其他部分尝试此函数,效果很好,函数取自other stackOverflow response)。

2 个答案:

答案 0 :(得分:0)

您的代码令人困惑,您有三个“新PDJpeg”,其中一个是陷阱(应该只处理错误)。 “read()”有什么作用?它是通过流还是BufferedImage?如果是流,那就错了,因为PDJpeg用于JPEG,而不用于PNG。

第二个

img = new PDJpeg(documento, (getClass().getResourceAsStream("/com/img/" + Byte.toString(item.getId()) + ".png")));
出于同样的原因,

明确错误:PDJPeg不适用于PNG文件/流。

如果要从PNG文件/流创建图像,请使用PDPixelMap。

可以从BufferedImage创建PDJpeg对象,但仅在以前未对图像进行编码时才建议使用此对象。因为如果您从JPEG读取BufferedImage,然后使用PDJPeg,那么当图像被解码并再次编码(JPEG是一种“有损”压缩格式)时,您的质量会略有下降。

如果我的建议无效,请将JPEG文件和PDF上传到某处。

还要确保您使用的是最新版本,即1.8.7。

评论后更新: createGraphics.drawImage()的参数应该是0,0而不是width,height。这两个参数是位置,而不是大小。

答案 1 :(得分:0)

最后,我找到了解决方案(也感谢Tilman Hausherr):

private void dibujarImagen(Item i, int x, int y, int alto, int ancho) throws IOException {
    PDPixelMap img = null;

    try {
        img = new PDPixelMap(documento, read(getClass().getResourceAsStream("/com/img/" + i.getId() + ".png")));
    }
    catch (IllegalArgumentException e) {
        img = new PDPixelMap(documento, SwingFXUtils.fromFXImage(Funciones.crearImagenDesdeTexto(i.getNombre()),null));
    }
    finally {
        contenedor.drawXObject(img, x, y, alto, ancho);
    }
}