Java pdfbox.util.ImageIOUtil.writeImage问题

Java pdfbox.util.ImageIOUtil.writeImage问题,java,pdfbox,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.grap


这里发生了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)

通读PDFBox代码,问题似乎是因为当时没有JPG图像的写入程序(请参阅第ImageIOUtil行第197行和追溯到)


我建议您的应用程序服务器中的某些东西调用ImageIO.scanForPlugins(),使用某种受限类路径,并对可用的编写器进行变异,或者其他东西正在进入并摆弄。

阅读PDFBox代码,问题似乎是因为当时没有JPG图像的写入程序(请参阅第197行的ImageIOUtil和追溯到)


我建议您的应用程序服务器中的某些东西正在调用ImageIO.scanForPlugins(),使用某种受限类路径并改变可用的写入程序,或者其他东西正在进入并进行篡改。

问题是下面的ImageWriter已注册,但无法正确启动:

com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageWriterSpi

因此,当调用
ImageWriterInterator.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

-Dcom.sun.media.jai.disableMediaLib=true添加到JVM启动时,会使出现问题的ImageWriter不再注册。

问题是以下ImageWriter已注册,但无法正确启动:

com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageWriterSpi

因此,当调用
ImageWriterInterator.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不再注册。

您能否扩展您的问题,以便我们知道您的代码中出现问题的地方?您好,这段代码似乎引发了异常:pdxObjectImg=new PDJpeg(document,convertedFile);请使用当前版本(1.8.13)重试。顺便说一句,如果源文件是TIFF文件,将其压缩为jpeg通常是个坏主意。最好使用另外两个图像类中的一个,即PDPixelMap或PDCcitt。您监控过内存消耗吗?当您在运行数小时后出现这种行为时,某种资源消耗听起来似乎是合理的……是的,我做到了。我没有看到任何与内存/CPU有关的问题。您能否扩展您的问题,以便我们知道代码中出现问题的地方?您好,这段代码似乎引发了异常:pdxObjectImg=new PDJpeg(document,convertedFile);请使用当前版本(1.8.13)重试。顺便说一句,如果源文件是TIFF文件,将其压缩为jpeg通常是个坏主意。最好使用另外两个图像类中的一个,即PDPixelMap或PDCcitt。您监控过内存消耗吗?当您在运行数小时后出现这种行为时,某种资源消耗听起来似乎是合理的……是的,我做到了。我没有看到任何与内存/CPU有关的问题。有点可怕,
writers.hasNext()
true
但是
writers.next()
在那之后不久就为空了?!完全同意;如果在另一个线程上发生重新扫描,我会期望出现一个
ConcurrentModificationException
或其他什么。如果不进行某种远程调试并在发生问题时深入了解,则很难看到这里还发生了什么问题,因为writers.hasNext()为true,writers.next为null。通过添加以下JVM参数在本地修复了该问题:Dcom.sun.media.jai.disableMediaLib=truekindofthat
writers.hasNext()
true
writers.next()
不久后为null?!完全同意;如果在另一个线程上发生重新扫描,我会期望出现一个
ConcurrentModificationException
或其他什么。如果不进行某种远程调试并在发生问题时深入了解,则很难看到这里还发生了什么问题,因为writers.hasNext()为true,writers.next为null。通过添加以下JVM参数,本地解决了该问题:Dcom.sun.media.jai.disableMediaLib=trueGreat find。我已经创造了在未来抓住这一点。伟大的发现。我已经创造了在未来抓住这一点。