При рендеринге кучи PDF-файлов изображениям icepdf, казалось бы, случайно удаляется OutOfMemoryError. Попытка отследить это вниз, я найти две вещей:Ограничить размер изображения в icepdf
- Близко к ООМУ вынесенной странице A0 или аналогичным образом больших страниц документа
- С затмением анализатором памяти я нахожу 1/2 Гб изображения в памяти.
Это позволяет ограничить размер выходного изображения чем-то управляемым. Интересно, что самый простой способ сделать это?
Я смотрел объект страницы icepdf, но там настоятельно рекомендуется всегда использовать Page.BOUNDARY_CROPBOX
, и другие виды использования, похоже, не документируются в Javadoc.
Как ограничить размер выходного изображения Document.getPageImage
или какую другую меру я могу использовать для предотвращения OOM (кроме как только увеличения Xmx, чего я не могу). Снижение качества изображения является опцией. Но он должен применяться только к «негабаритным» изображениям, а не ко всем.
Я уже пытался использовать предопределенное изображение с помощью Document.paintPage(), но этого было недостаточно.
Отладка, наконец, позволила мне увеличить масштаб документа, который является проблематичным. Я получаю журнал, как:
2016-12-09T14:23:35Z DEBUG class org.icepdf.core.pobjects.Document 1 MEMFREE: 712484296 of 838860800
2016-12-09T14:23:35Z DEBUG class org.icepdf.core.pobjects.Document 1 LOADING: ..../F1-2.pdf
2016-12-09T14:23:37Z WARN class org.icepdf.core.pobjects.graphics.ScaledImageReference 1 Error loading image: 9 0 R Image stream= {Type=XObject, Length=8 0 R, Filter=FlateDecode, ColorSpace=DeviceGray, Decode=[1, 0], Height=18676, Width=13248, Subtype=Image, BitsPerComponent=1, Name=Im1} 9 0 R
так что это будет Height = 18676, ширина = 13248, который действительно огромен.
Я полагаю, что OOM происходит уже во время загрузки изображения, поэтому дальнейшее масштабирование не помогает. Также кажется, что свойство org.icepdf.core.imageReference=scaled
не ударило достаточно рано.
Для меня было бы замечательно просто игнорировать негабаритные изображения, подобные этому. Любой шанс?
Это то, что я грустно догадался: изображения могут стать чрезвычайно большими при загрузке. Я попробовал ваше предложение о внедрении SkipImageStreamReference.С Xmx = 900m (преднамеренно немного маленьким) он все еще бомбит OOM на изображениях размером менее 1500x1500. У нас есть много схем построения с размерами от 10000^2 до 20000^2, поэтому нам потребуется, если линейно масштабировать, более 90 ГБ оперативной памяти. – Harald
Байт-буферы с отображением памяти будут препятствовать OOM, но они по-прежнему требуют либо большого количества ОЗУ, либо огромного пространства подкачки или файла подкачки, что приведет к урон производительности. Я понятия не имею, как рендеринг PDF действительно работает, но я подозреваю, что должен быть способ иметь даже первоначальный рендеринг, уменьшающий разрешение до требуемого размера. – Harald