2015-04-02 1 views
3

Мне нужно объединить несколько 1-страничных pdf-файлов в один pdf-файл. Я использую iTextSHarp 5.5.5.0 для этого, но когда мне удается объединить более 900-1000 pdf, я получаю исключение из памяти. Я заметил, что даже если я освобожу своего читателя и закрою его, память никогда не очищается должным образом (объем памяти, используемой процессом, никогда не уменьшается), поэтому мне было интересно, что я могу сделать неправильно. Это мой код:ITextSharp Исключить из памяти исключение слияния нескольких pdf

using (MemoryStream msOutput = new MemoryStream()) 
     { 
      Document doc = new Document(); 
      PdfSmartCopy pCopy = new PdfSmartCopy(doc, msOutput); 
      doc.Open(); 
      foreach (Tuple<string, int> file in filesList) 
      { 
       PdfReader pdfFile = new PdfReader(file.Item1); 
       for (int j = 0; j < file.Item2; j++) 
        for (int i = 1; i < pdfFile.NumberOfPages + 1; i++)//in this case it's always 1. 
         pCopy.AddPage(pCopy.GetImportedPage(pdfFile, i)); 
       pCopy.FreeReader(pdfFile); 
       pdfFile.Close(); 
       File.Delete(file.Item1); 
      } 
      pCopy.Close(); 
      doc.Close(); 

      byte[] content = msOutput.ToArray(); 
      using (FileStream fs = File.Create(Out)) 
      { 
       fs.Write(content, 0, content.Length); 
      } 
     } 

Он никогда не будет писать файл, я получаю из исключения памяти во время p.Copy() AddPage() часть.. Я даже попытался сбросить переменную pCopy, но ничего не изменил. Я просмотрел документацию iText и различные вопросы вокруг StackOverflow, но мне кажется, что я принимаю все предложения, чтобы поддерживать низкий уровень использования памяти, но этого не происходит. Любые идеи по этому поводу?

+3

Используйте 'PdfCopy' вместо' PdfSmartCopy'. 'PdfSmartCopy' является« умным », потому что он хранит много материала в памяти. –

+5

Также попробуйте записать в файл 'FileStream' непосредственно вместо' MemoryStream'. В буквальном смысле вы можете потерять память. –

+0

Hy, большое спасибо за очень быстрые ответы, PdfCopy вместо PdfSmartCopy был хорош и уменьшил использование памяти почти до половины, но FileStream был намного лучше, теперь я использую только 15 МБ памяти вместо 1 ГБ, а не Плохо. И я могу использовать PDfSmartCopy, который производит гораздо меньше PDF-файлов. Если вы сделаете и ответьте на это, я буду одобрять и принять, спасибо. –

ответ

5

Поскольку это большое количество материалов, я бы рекомендовал писать непосредственно на FileStream вместо MemoryStream. Это может быть реальный случай, когда исключение Out of Memory может буквально означать «Out of Memory».

Кроме того, как отметил Бруно, «умная» часть PdfSmartCopy, к сожалению, также оплачивается за счет памяти. Переключение на PdfCopy должно уменьшить давление памяти, хотя ваш окончательный PDF-файл может быть больше.

Смежные вопросы