我尝试使用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)。
答案 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);
}
}