pdfbox.util.ImageIOUtil.writeImage问题

时间:2017-03-29 14:50:40

标签: java pdfbox


这里有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();

2 个答案:

答案 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(),使用某种类型的约束类路径并改变可用的编写器,或其他东西进入和摆弄。