2017-04-06 7 views
0

PDFRenderer의 renderImageWithDPI 메소드를 사용하여 다른 PDF 파일의 이미지를 렌더링하려고합니다. 특정 페이지에서 일부 페이지의 경우 라이브러리 렌더러의 동작이 다릅니다.PDFBox 2 비정상적인 메모리 사용

렌더링 자체가 다른 유사한 페이지보다 오래 걸리고 메모리 소비가 비정상적으로 큰 값에 도달합니다. 프로세스에서 소비하는 메모리가 1 - 2 초마다 약 50MB로 올라가고 5GB RAM과 같은 값에 도달 할 때까지 renderImageWithDPI 중에 응용 프로그램 프로세스에서 소비합니다. 스레드가 renderImageWithDPI를 끝내면 메모리 소비는 거의 1.5-2 GB로 즉시 떨어집니다. 높은 메모리 소비로 인해 때때로 Java 힙 공간 예외가 발생할 수 있습니다.

동일한 페이지의 너비, 높이 및 디스크 크기가 다른 페이지와 눈에 띄게 다릅니다. 렌더링은 ImageType RGB로 250 DPI로 수행됩니다. 또한 응용 프로그램은 "-Dsun.java2d.cmm = sun.java2d.cmm.kcms.KcmsServiceProvider"매개 변수로 실행됩니다.

메모리 누수입니까? 예상되는 동작입니까? 또한, 왜 일부 페이지가 2GB의 메모리를 빨아 들이고 렌더링되는 데 1 분이 걸릴지, 몇 초 내에 렌더링되는 이유를 설명 할 수 있습니까?

+0

문제의 PDF를 공유 할 수 있습니까? – mkl

+0

전자 메일 주소를 제공하여 Google 드라이브 링크를 보낼 수 있습니까? – Cristian

+0

어쩌면 음영, 아마도 복잡한 패턴 ... snafu dot de에서 tilman에게도 링크를 보내주십시오. –

답변

0

PDF를 분석 한 결과 34 페이지에는 10000 개 이상의 XObject 요소가 있고 거의 모든 요소가 CMYK 이미지를 가지고 있음을 보여줍니다. the PDFDebugger command line app으로 직접 확인하고, 34 페이지로 이동 한 다음 리소스와 XObject로 이동하십시오. 그들을 변환하는 것은 자바에서 매우 빠르지 않다. 메모리 사용량은 우리가 이러한 이미지를 캐싱하기 때문에 발생했을 가능성이 큽니다. 다음에 페이지가 표시되면 훨씬 빨리 수행된다는 것을 알 수 있습니다. 캐시를 비활성화하면 FAQ에 표시됩니다.

-Dorg.apache.pdfbox.rendering.UsePureJavaCMYKConversion=true 옵션을 사용하면 속도 향상 (89 초 대신 21 초)이 가능합니다. 그러나 화질은 약간 다를 수 있습니다. PDFBOX-3569을 참조하십시오.

+0

우리는 FAQ에서 언급 한 마지막 옵션과 이미지 품질이 실제로 우리에게 중요하다는 의견과 함께 모든 옵션을 시도 할 것입니다. 이 문제를 이해해 주셔서 감사합니다. – Cristian

+0

https://issues.apache.org/jira/browse/PDFBOX-3569를 읽은 후에는 렌더링 속도가 느려지므로 KcmsServiceProvider와 UsePureJavaCMYKConversion을 동시에 사용하지 않아야합니다. 우리는 하나의 pdf 또는 다른 것에 따라 둘 사이를 전환 할 수 없으므로 KcmsServiceProvider 만 사용합니다. – Cristian

+0

제 경우에는 둘 다 사용하면 속도가 빨라졌습니다. –