如何将pdf文件直接写入磁盘,而不是内存

时间:2016-08-03 15:34:14

标签: c# pdf-generation itext

我正在编写一份包含大量内容的报告,并且pdf的大小越来越大,以便在服务器内存上写入。

现在我正在运行一项超过500万条记录的测试(实际生产案例),数据本身需要近4.5GB,pdf现在正在编写350万条注册表,而应用程序的内存使用情况则是在35GB。

现在运行速度非常慢,因为服务器的内存占用了95%。

我的代码看起来像这样:

Console.WriteLine("Gathering Data");
DataTable dt = functionthatgathersdata();

Document document = new Document(PageSize.A4.Rotate(), 0f, 0f, 140f, 70f);

using (FileStream ms = new FileStream(@"E:\rel.pdf", FileMode.Create))
{
    PdfWriter writer = PdfWriter.GetInstance(document, ms);
    writer.PageEvent = new PageTemplateReport()
    {
        attr = "report header"
    };

    document.Open();
    iTextSharp.text.Font font5 = iTextSharp.text.FontFactory.GetFont(FontFactory.HELVETICA, 8);

    PdfPTable table = new PdfPTable(dt.Columns.Count - 1);
    float[] widths = new float[] { 50f, 100f, 40f, 50f, 50f, 50f, 130f, 50f, 50f, 28f, 35f };
    table.SetWidths(widths);
    table.WidthPercentage = 95f;
    table.HeaderRows = 1;

    PdfPCell cell = new PdfPCell(new Phrase("Report"));

    cell.Colspan = dt.Columns.Count - 1;

    table.AddCell(new Phrase("col1", font5));
    table.AddCell(new Phrase("col2", font5));
    table.AddCell(new Phrase("col3", font5));
    table.AddCell(new Phrase("col4", font5));
    table.AddCell(new Phrase("col5", font5));
    table.AddCell(new Phrase("col6", font5));
    table.AddCell(new Phrase("col7", font5));
    table.AddCell(new Phrase("col8", font5));
    table.AddCell(new Phrase("col9", font5));
    table.AddCell(new Phrase("col10", font5));
    table.AddCell(new Phrase("col11", font5));
    var i = 0;

    foreach (DataRow r in dt.Rows)
    {
        i++;
        Console.WriteLine(i.ToString() + " of " + dt.Rows.Count +  " " + "size: " + ms.Length / 1024 + "KB");

        if (dt.Rows.Count > 0)
        {
            table.AddCell(new Phrase(r[0].ToString(), font5));
            table.AddCell(new Phrase(r[1].ToString(), font5));
            table.AddCell(new Phrase(r[2].ToString(), font5));
            table.AddCell(new Phrase(r[3].ToString(), font5));
            table.AddCell(new Phrase(r[4].ToString(), font5));
            table.AddCell(new Phrase(r[5].ToString(), font5));
            table.AddCell(new Phrase(r[7].ToString(), font5));
            table.AddCell(new Phrase(r[8].ToString(), font5));
            table.AddCell(new Phrase("", font5));
            table.AddCell(new Phrase(r[10].ToString(), font5));
            table.AddCell(new Phrase((r[11].ToString() == string.Empty) ? "" : Convert.ToDecimal(r[11].ToString()).ToString("N2") + " KB", font5));



        }
    }
    document.Add(table);


    ms.Close();

}

对于数据部分,我可以解决收集数据块的问题,编写它们并将它们处理以获得另一个数据块。

对于pdf部分,我想知道是否有办法直接在磁盘上写入数据,而不是从内存中操作它。

0 个答案:

没有答案