0

テンプレートに基づいて PDF ドキュメントを生成しています。ドキュメントには複数のページがあります。ドキュメントには約 5000 ページを含めることができます。500 番目のページを作成すると、オーバーフロー 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));
                }
            }
        }                
    }
}

ps 次のように問題を解決しようとしています: テンプレートに基づいて空のページを生成する

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();            
    }

しかし、生成後、フィールドに値を設定できません。

4

1 に答える 1

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();
}
于 2012-07-07T09:26:25.663 に答える