Исключение памяти при копировании PDF-файла большого размера с использованием iText 7 C # (версия 7.1.12)

#.net #itext #itext7

#.net #itext #itext7

Вопрос:

Я пытаюсь выполнить некоторые манипуляции с существующим документом (размером 3 ГБ). Я не нахожу проблем при чтении документа с помощью PdfReader. Я получаю исключение памяти при копировании существующих страниц документа в новый документ. Пожалуйста, найдите фрагмент кода, который я создал

 string inputFile = CommonHelper.GetPdfFilePath("MergeRootAttributesOntoPage.pdf");
            string outputFile = CommonHelper.GetOutputPdfFile("MergeRootAttributesOntoPage_iText7");
            PdfReader pdfReader = new PdfReader(
                                                new RandomAccessSourceFactory().SetForceRead(false).CreateBestSource(inputFile),
                                                new ReaderProperties()
                                                    );
            PdfDocumentWrapper sourceDocument = new PdfDocumentWrapper(pdfReader, true);
            PdfWriter pdfWriter = new PdfWriter(outputFile).SetSmartMode(true);
            PdfDocumentWrapper destinationDocument = new PdfDocumentWrapper(pdfWriter);
            destinationDocument.InitializeOutlines();

            sourceDocument.CopyPagesTo(1, sourceDocument.GetNumberOfPages(),destinationDocument);
            sourceDocument.Close();
            destinationDocument.Close();
  

Сценарий копирования с объектом слияния PDF :

  string inputFile = CommonHelper.GetPdfFilePath("MergeRootAttributesOntoPage.pdf");
            string outputFile = CommonHelper.GetOutputPdfFile("MergeRootAttributesOntoPage_iText7");
            PdfReader pdfReader = new PdfReader(
                                                new RandomAccessSourceFactory().SetForceRead(false).CreateBestSource(inputFile),
                                                new ReaderProperties()
                                                );
            PdfDocumentWrapper sourceDocument = new PdfDocumentWrapper(pdfReader, true);
            PdfWriter pdfWriter = new PdfWriter(outputFile).SetSmartMode(true);
            PdfDocumentWrapper destinationDocument = new PdfDocumentWrapper(pdfWriter);
            PdfMerger resultDocument = new PdfMerger(destinationDocument).SetCloseSourceDocuments(true);
            resultDocument.Merge(sourceDocument, 1, sourceDocument.GetNumberOfPages()).Close();
            resultDocument.Close();
  

Копируйте страницы одну за другой

  string inputFile = CommonHelper.GetPdfFilePath("MergeRootAttributesOntoPage.pdf");
            string outputFile = CommonHelper.GetOutputPdfFile("MergeRootAttributesOntoPage_iText7");
            PdfReader pdfReader = new PdfReader(
                                                new RandomAccessSourceFactory().SetForceRead(false).CreateBestSource(inputFile),
                                                new ReaderProperties()
                                                );
            PdfDocumentWrapper sourceDocument = new PdfDocumentWrapper(pdfReader, true);
            PdfWriter pdfWriter = new PdfWriter(outputFile).SetSmartMode(true);
            PdfDocumentWrapper destinationDocument = new PdfDocumentWrapper(pdfWriter);
            destinationDocument.SetCloseWriter(false);
            destinationDocument.InitializeOutlines();
            PdfPageFormCopier pdfPageFormCopier = new PdfPageFormCopier();

            for (int i = 1; i <= sourceDocument.GetNumberOfPages();   i)
            {
               destinationDocument.AddPage(sourceDocument.GetPage(i).CopyTo(destinationDocument, pdfPageFormCopier));
            }
  

Все вышеперечисленные методы завершились исключением памяти при копировании объектов
Любое решение приветствуется

Комментарии:

1. Сколько памяти потребляется кодом? Вы пробовали увеличивать размер памяти?

2. Используется почти 91 % памяти процессора

3. 271265792 значения, полученные с помощью следующего кода « Process currentProc = Процесс. GetCurrentProcess(); long memoryUsed = currentProc.PrivateMemorySize64; «

4. Это меньше 270 МБ, правильно? Это не похоже на высокое потребление памяти в современной среде