Как избежать нехватки памяти при чтении сложного PDF-файла через iText7?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как избежать нехватки памяти при чтении сложного PDF-файла через iText7?

Сообщение Anonymous »

Я использую iText7 и Java для чтения PDF-файлов, которые не очень велики (10–30 МБ), но содержат огромное количество объектов, что вызывает проблемы OutOfMemoryError при создании и использовании PdfDocument . (Внутренние таблицы внешних ссылок и объекты Map/Tree/Pdf[Dict/Array] исчисляются миллионами.)

Например, Размер одного PDF-файла может составлять всего 33 МБ, но он содержит одну таблицу с миллионом строк, охватывающую 800 страниц, а объем бухгалтерского учета внутри PdfDocument увеличивается до 400 МБ. Вот пример кода и дамп кучи:

Код: Выделить всё

public static void main(String[] args) throws Exception {

// PDF file is 33MB on disk (one big table over 800 pages)
File pdf = new File("big.pdf"); // Also tried InputStream

PdfReader reader = new PdfReader(pdf); // 35MB heap

PdfDocument document = new PdfDocument(reader); // 400MB+ heap

// do stuff ... assuming we didn't get an OOM above
}
Изображение


Мы добавили больше памяти в JVM, но не знаем, насколько большими/сложными могут быть некоторые из этих PDF-файлов, поэтому необходимо долгосрочное решение, в идеале такое, которое позволяет нам читать содержимое по частям или в виде обратного вызова в виде событий (например, XML+STAX/SAX).

Есть ли более эффективный способ потоковой передачи PDF-файла или разбить его на вложенные PDF-документы с учетом файла или входного потока? Мы хотим находить и извлекать такие объекты, как формы, таблицы, всплывающие подсказки и т. д.

Обновление: я связался с командой IText и IText7. не позволяет частичное чтение PDF-файлов. Так что в этом случае я мало что могу сделать, кроме как добавить больше оперативной памяти или предварительно проанализировать PDF-файл mysql и поискать «слишком много данных» (много работы). Я также проверил PDFBox, и у него та же проблема.

Подробнее здесь: https://stackoverflow.com/questions/578 ... via-itext7
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»