2016-06-24 5 views
0

Когда я пытаюсь преобразовать PDF в изображение, то для некоторых PDF-файлов я получаю ошибку «из памяти». Таким образом, я увеличил размер кучи, а затем снова получил ошибку для другого PDF-файла. пока что у меня нет утечки памяти из других объектов. Так в чем же причина этой памяти из-за ошибки? Было бы так, что изображение настолько велико (что не так, я думаю), что он потребляет кучу, или, может быть, pdfbox хранит буферизованное изображение каждой страницы в своей памяти, и это способствует увеличению размера кучи? Любое понимание было бы замечательно.PDF-рендеринг с использованием pdfbox

Вот ссылка на pdf, которую я пытаюсь сделать. https://drive.google.com/file/d/0B_Ke2amBgdpeNFFDem5KVVVzanc/view?usp=sharing Вот сегмент кода.

PDFRenderer pdfRenderer = new PDFRenderer(pdDoc); 
BufferedImage image = pdfRenderer.renderImageWithDPI(page-1, 300,ImageType.GRAY); 
//image=ImageHelper.convertImageToGrayscale(image); 
ImageIOUtil.writeImage(image,"G:/Trial/tempImg.png", 300); 

Пожалуйста, обратите внимание, что для этой конкретной проблемы Pdf была решена путем увеличения размера кучи, но то, что я хочу знать, что делает pdfbox хранит в буфере изображения в памяти и способствует размер кучи.

Вот еще один PDF, который столкнулся с той же проблемой даже после увеличения размера кучи. https://drive.google.com/file/d/0B_Ke2amBgdpedDBtaG1QcW1oYlU/view?usp=sharing В этом pdf мой код длится вечно при рендеринге страницы 44. Я не знаю, почему это происходит.

+0

Возможно, добавьте размер того, что вы пытаетесь преобразовать, и фрагмент кода делает это – Zeromus

+0

Я отредактировал свое сообщение и загрузил код и файл. – ANKIT

+1

относительно использования памяти: если я не ошибаюсь, то в pdfbox используется много памяти (особенно с цветными изображениями), да, он хранит все эти страницы в памяти, даже если вам они не нужны (год назад или около того у них были планы по readOnDemand/удалить после использования, но я не обновлялся). вы можете попробовать использовать файл с царапинами для сохранения памяти, но он будет медленным. – Zeromus

ответ

0

Ну Кажется, что эта проблема не из-за каких-либо ошибок или утечек памяти, а из-за размера изображения. Предлагаемые решения: - 1) Увеличьте размер Xmx 2) Переключитесь на 64-битную JVM.

EDIT: - Спасибо за ответы. Я просто собираюсь это описать здесь. Испытания были выполнены @Tilman Hausherr, и результаты заключались в том, что размер кучи должен быть увеличен. Обратите внимание, что использовался 64-битный jvm.

+0

На JDK7 64bit один файл работает с -Xmx90m, другой - с -Xmx400m. –

+0

Да, увеличение размера Xmx - это исправление, но когда есть слишком много файлов в формате PDF, куча становится полной. Хей @ ТилльХаушер, можете ли вы сделать для меня одну вещь, пожалуйста, после помещения строки image.flush() повторите вышеуказанный код слишком много раз, а затем увидеть кучу кучи. Вы можете сделать это с любым pdf. Пожалуйста, уточните меня в результатах. Мой результат: - Слишком много ссылок класса finalizer, которое увеличилось бы только без петель. – ANKIT

+0

Это займет некоторое время. Моему ПК 6 лет. И я обычно выключаю его ночью, чтобы комната могла немного остыть. –

Смежные вопросы