2017-03-29 3 views
0


PDFbox 여기에가는 문제가 있습니다.pdfbox.util.ImageIOUtil.writeImage 문제

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) 

우리의 현재 설정은 웹 스피어 8.5 및 자바 6를 통해 실행되는 각 서버에 대한 2 개의 JVM 2 개 서버입니다.

우리가 문제가 보인다의 JVM이 해결 될 다시 시작

하지만 몇 시간 후 우리는 같은 예외를 얻을.

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

당신은 문제가 코드에서 발생하는 위치 우리가 알도록 질문을 확장 할 수 있습니까? –

+0

안녕,이 코드 조각처럼 보이는이 예외를 던지고있다 : PDXObjectImage의 IMG = 새로운 PDJpeg (문서, convertedFile); – PauloP

+0

현재 버전 (1.8.13)으로 다시 시도하십시오. Btw 소스가 TIFF 파일 인 경우 jpeg로 압축하면 대개 나쁜 생각입니다. 이미지에 다른 두 클래스 중 하나 인 PDPixelMap 또는 PDCcitt를 사용하는 것이 좋습니다. –

답변

0

에 대한 작가가 없기 때문에이 문제가 발생 것처럼 보일 것이다 PDFBox 코드를 통해 읽기 :
응용 프로그램은 PDFBox의 v1.8.8 여기

를 사용하는 코드의 조각 그 당시 사용 가능한 JPG 이미지 (ImageIOUtil 197 행 참조 및 line 184 추적).

귀하의 앱 서버에있는 뭔가가 제한된 클래스 패스로 ImageIO.scanForPlugins()를 호출하고 사용 가능한 작성자를 변경하거나 뭔가 다른 것을 들여다보고있는 것이 좋습니다.

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

그래서

ImageWriterIterator.next()를 호출 할 때, spi.createWriterInstance()가 던지는되었다 :

+0

는'곧 그 후 null의?! –

+0

완전히 동의합니다. 다른 스레드에서 재검색이 발생하는 경우 'ConcurrentModificationException'또는 무언가가 예상됩니다. 원격 디버깅의 어떤 종류를 받고는 writers.hasNext()가 true이지만 writers.next가 null 때문에 문제가 일어나는 –

+2

발생했을 때의 파고없이 여기 벌어지고 그 밖의 무엇을 볼 어려운. 다음 JVM 매개 변수를 추가하여 로컬에서 문제가 해결되었습니다. Dcom.sun.media.jai.disableMediaLib = true – PauloP

3

문제는의 ImageWriter가 아래에 등록했지만 제대로 시작하지 않을 것이라고했다 자동 IOException가 및 null이 반환되었습니다 spi.createWriterInstance() 실패 된 이유는

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; 
} 

이었다

java.lang.NoClassDefFoundError: com/sun/medialib/codec/jpeg/Encoder 

을 JVM 시작에 추가하면 문제가되는 ImageWriter가 더 이상 등록되지 않습니다.

+0

Great find.나는 이것을 미래에 잡기 위해 https://issues.apache.org/jira/browse/PDFBOX-3739를 만들었습니다. –