Например, Размер одного 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