разделить огромный 40000 страниц pdf на отдельные страницы, itextsharp, outofmemoryexception

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

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

теперь мне нужно разделить огромный файл на отдельные страницы, затем попытаться прочитать некоторые данные получателя со страниц 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?

5 ответов


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

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

это общий снимок в темноте, и я не тестировал этот код - это извлечение кода из книги "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));

возможно, вы сможете использовать Ghostscript напрямую. http://svn.ghostscript.com/ghostscript/tags/ghostscript-9.02/doc/Use.htm#One_page_per_file

для чтения данных получателя pdftextstream может быть хорошим выбором.


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


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

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

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