Подтвердить что ты не робот

Разбивать огромные 40000 страниц PDF на отдельные страницы, itextsharp, outofmemoryexception

Я получаю огромные файлы PDF с большим количеством данных. Текущий PDF составляет 350 МБ и имеет около 40000 страниц. Разумеется, было бы неплохо получить меньшие PDF файлы, но с этим я должен работать сейчас: - (

Я могу открыть его в приложении для чтения акробатов с некоторой задержкой при загрузке, но после этого быстрый просмотрщик акробатов.

Теперь мне нужно разбить огромный файл на отдельные страницы, а затем попытаться прочитать некоторые данные получателя из страниц pdf, а затем отправить одну или две страницы, которые каждый получатель должен получить каждому конкретному получателю.

Вот мой очень маленький код, используя itextsharp:

var inFileName = @"huge350MB40000pages.pdf";
PdfReader reader = new PdfReader(inFileName);
var nbrPages = reader.NumberOfPages;
reader.Close();

Что происходит, так это во второй строке "новый PdfReader", а затем остается там, возможно, 10 минут, процесс достигает примерно 1,7 ГБ, а затем я получаю исключение OutOfMemoryException.

Я думаю, что "новый PdfReader" пытается прочитать весь PDF в памяти.

Есть ли какой-нибудь другой/лучший способ сделать это? Например, можно ли каким-то образом прочитать только часть файла PDF в памяти, а не все сразу? Может ли он работать лучше, используя некоторую другую библиотеку, чем itextsharp?

4b9b3361

Ответ 1

Из того, что я прочитал, похоже, что при создании PdfReader вы должны использовать конструктор, который принимает объект RandomAccessFileOrArray. Отказ от ответственности: я сам не пробовал это.

iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(new iTextSharp.text.pdf.RandomAccessFileOrArray(@"C:\PDFFile.pdf"), null);

Ответ 2

Это полный снимок в темноте, и я не тестировал этот код - это извлечение кода из книги "iText In Action", которая приводится в качестве примера того, как обращаться с большими файлами PDF. Код находится на Java, но его довольно легко конвертировать -

Это метод, который загружает все в память -

PdfReader reader;
long before;
before = getMemoryUse();
reader = new PdfReader(
"HelloWorldToRead.pdf", null);
System.out.println("Memory used by the full read: "
+ (getMemoryUse() - before));

Это способ сохранения памяти, где документ должен быть загружен поэтапно по мере необходимости -

before = getMemoryUse();
reader = new PdfReader(
new RandomAccessFileOrArray("HelloWorldToRead.pdf"), null);
System.out.println("Memory used by the partial read: "
+ (getMemoryUse() - before));

Ответ 4

PDF Toolkit весьма полезен для этих задач. Не пробовал это с таким огромным файлом, хотя.

Ответ 5

Может ли он работать лучше, используя некоторую другую библиотеку, чем itextsharp?

Попробуйте Aspose.Pdf для .NET, который позволяет split PDF на отдельные страницы, или вы можете разделить PDF на разные страницы различными способами, используя либо файлы, либо потоки памяти. API очень прост в освоении и использовании. Он работает с большими файлами PDF, имеющими большое количество страниц.

Раскрытие информации: Я работаю евангелистом-разработчиком в Aspose.