首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iTextSharp内存(内存)溢出

iTextSharp内存(内存)溢出
EN

Stack Overflow用户
提问于 2012-06-29 09:50:26
回答 1查看 985关注 0票数 0

我正在基于模板生成一个PDF文档。文档有多个页面。这份文件大约有5000页。在创建第500页时,我会得到一个溢出RAM (内存).有什么想法吗?

代码语言:javascript
复制
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我正在尝试解决我的问题如下:基于模板生成空页面

代码语言:javascript
复制
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();            
    }

但是在生成之后,我无法为字段设置值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-07 09:26:25

我找到了解决问题的方法,如果其他人感兴趣的话:

代码语言:javascript
复制
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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11259625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档