2012-06-29 136 views
0

我正在生成基于模板的PDF文档。该文件有多个页面。该文件可以有大约5000页。当创建第500页时,我得到一个溢出RAM(内存)。任何想法?iTextSharp RAM(内存)溢出

public static void CreateBankBlank2012Year(string pdfTemplatePath, string directoryOutPdf, string nameOutPdf, AnnualReportsFilterParameters filterParametrs, string serverPath) 
{ 
    // Get details salary 
    IEnumerable<SalayDetailsForPdf> dataSalaryDetails = (IEnumerable<SalayDetailsForPdf>) GetSalaryData(filterParametrs);       

    String fontPath = Path.Combine(serverPath + "\\Fonts", "STSONG.ttf"); 
    Font font = FontFactory.GetFont(fontPath, BaseFont.IDENTITY_H, 8); 

    using (Document document = new Document()) 
    { 
     using (PdfSmartCopy copy = new PdfSmartCopy(
      document, new FileStream(directoryOutPdf + nameOutPdf, FileMode.Create)) 
     ) 
     { 
      document.Open(); 

      foreach (var data in dataSalaryDetails)      
      { 
       PdfReader reader = new PdfReader(pdfTemplatePath + @"\EmptyTemplateBankBlank_2012.pdf"); 
       using (var ms = new MemoryStream()) 
       { 
        using (PdfStamper stamper = new PdfStamper(reader, ms)) 
        { 
         stamper.AcroFields.AddSubstitutionFont(font.BaseFont); 
         AcroFields form = stamper.AcroFields; 
                                  form.SetField("t1_address1", data.Address1); 

         form.SetField("t1_name", data.NameHieroglyphic);         

         // Other field ... 

         stamper.FormFlattening = true; 
        } 
        reader = new PdfReader(ms.ToArray()); 

        copy.AddPage(copy.GetImportedPage(reader, 1)); 
       } 
      } 
     }     
    } 
} 

P.S 我试图解决我的问题如下: 产生空页基于模板

private static void GeneratePdfFromTemplate(string directoryOutPdf, string nameOutPdf, string pdfTemplatePath, int countPages) 
    {         
     using (Document document = new Document()) 
     { 
      using (PdfSmartCopy copy = new PdfSmartCopy(
       document, new FileStream(directoryOutPdf + nameOutPdf, FileMode.Create)) 
       ) 
      { 
       document.Open();           
       PdfReader reader = new PdfReader(pdfTemplatePath + @"\EmptyTemplateBankBlank_2012.pdf"); 
       for (int i = 0; i < countPages; i++)      
       {              
        copy.AddPage(copy.GetImportedPage(reader, 1));             
       } 
       reader.Close(); 
       copy.Close(); 
      } 
      document.Close(); 
     }    
     GC.Collect();    
    } 

但发电后,我不能设置值的字段。

回答

1

我找到解决我的问题,如果任何人有兴趣:

private static void SettingFieltValue(Font font, IEnumerable<SalayDetailsForPdf> dataSalaryDetails, int selectedYear, string directoryOutPdf, string nameOutPdf, string pdfTemplatePath) 
    { 
    string pdfTemplate = pdfTemplatePath + @"\EmptyTemplateBankBlank_2012.pdf"; 
    string newFile = directoryOutPdf + nameOutPdf; 

    var fs = new FileStream(newFile, FileMode.Create); 
    var conc = new PdfConcatenate(fs, true); 
    foreach (var data in dataSalaryDetails) 
    { 
     var reader = new PdfReader(pdfTemplate); 
     using (var ms = new MemoryStream()) 
     { 
      using (PdfStamper stamper = new PdfStamper(reader, ms)) 
      { 
       stamper.AcroFields.AddSubstitutionFont(font.BaseFont); 
       AcroFields form = stamper.AcroFields; 

       form.SetField("t1_name", data.NameHieroglyphic); 
       //Other field 

       stamper.FormFlattening = true; 
       stamper.Close(); 
      } 
      reader = new PdfReader(ms.ToArray()); 
      ms.Close();      
     } 
     conc.AddPages(reader); 
     reader.Close(); 
    } 
    conc.Close(); 
} 
+0

什么会释放内存?你能告诉更多吗? – SuperBerry