如何在itextsharp文档中并行设置两个表?

时间:2016-03-09 10:20:09

标签: c# itextsharp

如何在文档中并行设置两个表 enter image description here

生成pdf的示例代码是,

         Document doc = new Document(new Rectangle(288f, 144f), 10, 10, 10, 10);
        doc.SetPageSize(iTextSharp.text.PageSize.A4.Rotate());

        PdfWriter writer = PdfWriter.GetInstance(doc, Response.OutputStream);

        doc.Open();

        PdfPTable table = new PdfPTable(3);
        table.TotalWidth = 144f;
        table.LockedWidth = true;
        PdfPCell cell = new PdfPCell(new Phrase("This is table 1"));
        cell.Colspan = 3;
        cell.HorizontalAlignment = 1;
        table.AddCell(cell);
        table.AddCell("Col 1 Row 1");
        table.AddCell("Col 2 Row 1");
        table.AddCell("Col 3 Row 1");
        table.AddCell("Col 1 Row 2");
        table.AddCell("Col 2 Row 2");
        table.AddCell("Col 3 Row 2");
        table.WriteSelectedRows(0, -1, doc.Left, doc.Top, writer.DirectContent);


        table = new PdfPTable(3);
        table.TotalWidth = 144f;
        table.LockedWidth = true;
        cell = new PdfPCell(new Phrase("This is table 2"));
        cell.Colspan = 3;
        cell.HorizontalAlignment = 1;
        table.AddCell(cell);
        table.AddCell("Col 1 Row 1");
        table.AddCell("Col 2 Row 1");
        table.AddCell("Col 3 Row 1");
        table.AddCell("Col 1 Row 2");
        table.AddCell("Col 2 Row 2");
        table.AddCell("Col 3 Row 2");
        table.WriteSelectedRows(0, -1, doc.Left + 200, doc.Top, writer.DirectContent);
        doc.Close();
        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "attachment;" + "filename=Sample .pdf");
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Write(doc);
        Response.End();

运行此代码时,pdf下载但显示错误消息"无法加载PDF文档"。请帮我解决错误并获得预期输出

1 个答案:

答案 0 :(得分:2)

您的代码中存在许多问题。那些立即可见:

  • 您不会关闭文档doc ,但仅在关闭时创建PDF的某些重要部分,特别是交叉引用表。因此,您必须在完成其内容后尽快关闭文档。

  • 您尝试将doc写入回复

    Response.Write(doc);
    

    这是错误的,您必须将PdfWriter的输出定向到响应。你实际上也是这样做的,有点试图传输PDF两次:

    PdfWriter writer = PdfWriter.GetInstance(doc, Response.OutputStream);
    

    可是:

  • 您在开始撰写回复之后更改回复属性,即您首先创建PDF将其流式传输到Response.OutputStream,然后才更改内容类型,内容处置和缓存标头。

    这很可能会导致Response忽略您的设置或忘记到目前为止流式传输的内容。

在你解决这些问题之前,我建议你创建一个简单的 HelloWorld PDF而不是你的并行表,以免在PDF生成中遇到问题,并且在使用像{{{ 1}}彼此混合。