2013-05-16 86 views
0

我正在使用iTextSharp(5.4.1.0)將一組PDF文件合併到一個文件中。 在具有LARG文件I在關閉文檔的線得到的System.OutOfMemoryException情況下[document.Close();]iTextSharp用Larg文件引發異常OutOfMemoryException

這是我的合併函數:

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存在於內存中。必須嘗試合併到文件流中嗎?順便說一句:使用'PdfWriter'合併文檔通常不是一個好主意。使用一些'Pdf * Copy *'類通常是更好的方法。 – mkl

+0

謝謝Mkl :) –

回答

1

這裏的錯誤是我返回「output.GetBuffer();」之後不要釋放MemoryStream。