2013-05-16 3 views
0

Я использую iTextSharp (5.4.1.0), чтобы объединить множество файлов PDF в один файл. В случае наличия LARG файла я получил System.OutOfMemoryException на линии закрытия документа [document.close();]Исключение исключения iTextSharp OutOfMemoryException с файлом Larg

Вот моя сращивание функция:

public static byte[] MergeFiles(List<string> sourceFiles) 
    { 
     Document document = new Document(); 
     MemoryStream output = new MemoryStream(); 

     // Initialize pdf writer 
     PdfWriter writer = PdfWriter.GetInstance(document, output); 
     writer.PageEvent = new PdfPageEvents(); 

     try 
     { 
      // Open document to write 
      document.Open(); 
      PdfContentByte content = writer.DirectContent; 

      PdfReader reader; 
      PdfImportedPage importedPage; 

      // Iterate through all pdf documents 
      for (int fileCounter = 0; fileCounter < sourceFiles.Count; fileCounter++) 
      { 

       Console.WriteLine("File(" + (fileCounter + 1).ToString() + ") : " + sourceFiles[fileCounter].ToString()); 


       // Create pdf reader 
       reader = new PdfReader(new iTextSharp.text.pdf.RandomAccessFileOrArray(sourceFiles[fileCounter]), null); 
       //reader = new PdfReader(sourceFiles[fileCounter]); 
       int numberOfPages = reader.NumberOfPages; 

       // Iterate through all pages 
       for (int currentPageIndex = 1; currentPageIndex <= numberOfPages; currentPageIndex++) 
       { 
        // Determine page size for the current page 
        document.SetPageSize(reader.GetPageSizeWithRotation(currentPageIndex)); 
        // Create page 
        document.NewPage(); 
        importedPage = writer.GetImportedPage(reader, currentPageIndex); 
        // Determine page orientation 
        int pageOrientation = reader.GetPageRotation(currentPageIndex); 
        if ((pageOrientation == 90) || (pageOrientation == 270)) 
        { 
         content.AddTemplate(importedPage, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(currentPageIndex).Height); 
        } 
        else 
        { 
         content.AddTemplate(importedPage, 1f, 0, 0, 1f, 0, 0); 
        } 
       } 


      } 

      document.Close(); 
      writer.Close(); 
     } 
     catch (Exception ex) 
     { 
      ErrorsHandling.LogException("MergeFiles", ex.Message, ex.StackTrace); 
     } 

     return output.GetBuffer(); 
    } 

Спасибо заранее.

+0

Вы используете поток памяти в качестве результата вашего слияния; таким образом, в процессе 'document.close' и' writer.close' весь результат PDF присутствует в памяти. Нужно ли пытаться объединиться в поток файлов? BTW: Использование 'PdfWriter' для слияния документов обычно не является хорошей идеей. Использование некоторого класса «Pdf * Copy *» обычно является лучшим подходом. – mkl

+0

Спасибо Mkl :) –

ответ

1

Ошибка была в том, что я возвращаю «output.GetBuffer();» и после этого не освобождайте MemoryStream.