Java PDFBox从BuffereImage绘制黑色图像

Java PDFBox从BuffereImage绘制黑色图像,java,bufferedimage,pdfbox,Java,Bufferedimage,Pdfbox,我尝试使用PDFBox将BuffereImage中的图像绘制到PDF中,但失败了,我得到了黑色图像,Acrobat Reader发出警告,其中有“内存不足”之类的错误(但PDF是显示的) 我使用BuffereImage是因为我需要将JavaFX图像对象(通过调用functiones.crearImagenDesdeTexto()将文本转换为图像)绘制成PDF。其余图像在不使用BuffereImage的情况下运行良好 PDPixelMap img = null; BufferedI

我尝试使用PDFBox将BuffereImage中的图像绘制到PDF中,但失败了,我得到了黑色图像,Acrobat Reader发出警告,其中有“内存不足”之类的错误(但PDF是显示的)

我使用BuffereImage是因为我需要将JavaFX图像对象(通过调用functiones.crearImagenDesdeTexto()将文本转换为图像)绘制成PDF。其余图像在不使用BuffereImage的情况下运行良好

    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图像对象(我在程序的其他部分尝试了这个函数,效果很好,函数是从中提取的)。

您的代码很混乱,您有三个“new PDJpeg”,其中一个处于捕获状态(应该可以处理错误)。“read()”是做什么的?它传递的是流还是缓冲区映像?如果它是一个流,那么它是错误的,因为PDJpeg用于JPEG,而不是PNG

第二个

img = new PDJpeg(documento, (getClass().getResourceAsStream("/com/img/" + Byte.toString(item.getId()) + ".png")));
完全错误,原因相同:PDJPeg不适用于PNG文件/流

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

可以从BuffereImage创建PDJpeg对象,但仅当图像之前未编码时才建议这样做。因为如果您从JPEG中读取BuffereImage,然后使用PDJPeg进行此操作,则当图像再次解码和编码时,质量会略有下降(JPEG是一种“有损”压缩格式)

如果我的建议没有帮助,请将JPEG文件和PDF文件上传到某个地方

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

评论后更新:
createGraphics.drawImage()的参数应为0,0,而不是宽度和高度。这两个参数是位置,而不是大小。

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


假设您的意思是“有时”,您在其中写道“可能”-您是否验证了BuffereImage不是黑色的?只需执行ImageIO.write(bufferedImage,“png”,新文件(“..../debug.png”))即可查看它以前是否为黑色。此外,我仍然想知道“read()”是做什么的,它是提供流还是提供缓冲区映像?这是ImageIO.read()吗?(然后它会提供一个BuffereImage,这很好)最好将这些步骤分开,即首先将您的图像加载到BuffereImage(以及用于此的try/catch),然后构建PDPixelMap(以及try/catch)。这将使您更容易调试。使用“异常”而不是例如“IOException”也会带来捕获“太多”的危险。您只希望捕获文件不存在的情况,而不希望捕获其他可能指示不同问题的未知异常。假设“alto”=高度,“ancho”=宽度,那么您将在两个位置混淆(除非您希望这样)。
read()
from
javax。​图像。​ImageIO
返回缓冲区图像的包。alto=高度,ancho=宽度我采用相同的单位,所以是的,我混合了它们。我检查是否按您所说的保存图像(ImageIO.write…),文件为空。我不明白为什么它不起作用,因为我使用了相同的函数(functiones.crearImagenDesdeTexto(item.getNombre())来显示JavaFX面板中的图像,而且效果很好。
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);
    }
}