这里有PDFbox的问题。
java.lang.NullPointerException
at org.apache.pdfbox.util.ImageIOUtil.writeImage(ImageIOUtil.java:197)
at org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg.createImageStream(PDJpeg.java:190)
at org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg.<init>(PDJpeg.java:150)
我们当前的设置是2个服务器,每个服务器有2个JVM,运行在 Websphere 8.5 和 Java 6 上。
当我们重新启动JVM时,问题似乎得到了解决,但几个小时后我们得到了同样的例外 该应用程序使用 PDFBox v1.8.8
以下是一段代码:
ImageIO.setUseCache(false);
PDDocument document = new PDDocument();
PDPage page = new PDPage(PDPage.PAGE_SIZE_A4);
document.addPage(page);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedImage convertedFile = tiffToBufferedImageJAI(file);
PDXObjectImage img = new PDJpeg(document, convertedFile);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
contentStream.drawXObject(img, 0, 0, 550, 800);
contentStream.close();
document.save(baos);
document.close();
baos.flush();
return baos.toByteArray();
答案 0 :(得分:3)
问题是下面的ImageWriter已注册但无法正确启动:
com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageWriterSpi
因此,当调用ImageWriterIterator.next()
时,spi.createWriterInstance()
抛出一个静默的IOException并返回null:
public ImageWriter next() {
ImageWriterSpi spi = null;
try {
spi = (ImageWriterSpi)iter.next();
return spi.createWriterInstance();
} catch (IOException e) {
// Deregister the spi in this case, but only as a writerSpi
theRegistry.deregisterServiceProvider(spi, ImageWriterSpi.class);
}
return null;
}
spi.createWriterInstance()
失败的原因是:
java.lang.NoClassDefFoundError: com/sun/medialib/codec/jpeg/Encoder
向JVM启动添加-Dcom.sun.media.jai.disableMediaLib=true
使得不再注册违规的ImageWriter。
答案 1 :(得分:0)
通过阅读PDFBox代码,可能会出现问题,因为当时没有可用于JPG图像的编写器(请参阅ImageIOUtil第197行并追溯到line 184)。
我建议您的应用服务器中的某些东西调用ImageIO.scanForPlugins(),使用某种类型的约束类路径并改变可用的编写器,或其他东西进入和摆弄。