iTextsharp - 在每个页面的顶部重复一个html表

时间:2016-08-24 00:39:16

标签: c# itext

我计划使用iTextsharp创建发票,在我的发票内部,它由3部分组成

  1. 表格在页面顶部(包括所有供应商信息)
  2. gridview(购买项目)
  3. 签名部分(仅在发票的最后一页)
  4. 到目前为止,我使用Pdfptable + splitlate

    完成了gridview部分
           PdfPTable table = new PdfPTable(gv.Columns.Count);
           table.AddCell(new PdfPCell(new Phrase(cellText, fontH1)));
           ...
           ...
            //create PDF document
            Document pdfDoc = new Document(PageSize.A4, -30, -30, 15f, 15f);
            PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
            pdfDoc.Open();
            pdfDoc.Add(table);
            pdfDoc.Close();
            Response.ContentType = "application/pdf";
            Response.AddHeader("content-disposition", "attachment;" + "filename=GridViewExport.pdf");
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.Write(pdfDoc);
            Response.End();
    

    但我不知道如何在每个页面上插入表格。我计划使用html表,因为它需要控制很多东西,比如不同的供应商,地址,显示/隐藏或取消的图像。请帮忙。

1 个答案:

答案 0 :(得分:1)

之前已经提出了您的问题。请参阅官方文档中的How to add HTML headers and footers to a page?,或者在StackOverflow上查看How to add HTML headers and footers to a page?

Roman Sidorov的回答是错误的,因为Roman假定您从代码中触发NewPage()。这并不总是正确的。您将表添加到Document,该表跨多个页面。这意味着iText会在内部触发NewPage()功能。

您可以使用页面事件向每个创建的页面添加内容。在OnEndPage()操作执行之前触发NewPage()事件。这是当您向当前页面添加额外内容时。执行OnStartPage()操作后立即触发NewPage()事件。禁止在OnStartPage()事件中添加内容。见iTextSharp - Header and Footer for all pages

这是Java中页面事件实现的一个示例:

public class HeaderFooter extends PdfPageEventHelper {
    protected ElementList header;
    protected ElementList footer;
    public HeaderFooter() throws IOException {
        header = XMLWorkerHelper.parseToElementList(HEADER, null);
        footer = XMLWorkerHelper.parseToElementList(FOOTER, null);
    }
    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        try {
            ColumnText ct = new ColumnText(writer.getDirectContent());
            ct.setSimpleColumn(new Rectangle(36, 832, 559, 810));
            for (Element e : header) {
                ct.addElement(e);
            }
            ct.go();
            ct.setSimpleColumn(new Rectangle(36, 10, 559, 32));
            for (Element e : footer) {
                ct.addElement(e);
            }
            ct.go();
        } catch (DocumentException de) {
            throw new ExceptionConverter(de);
        }
    }
}

您可以轻松将其移植到C#。我用这个答案是因为它是文字问题的字面答案。但是:为什么要在HTML中定义标题(或页脚)。这没有意义,是吗?

为什么不创建PdfPTable并将其添加到页面事件中的每个页面。问题的答案中解释了这一点How to add a table as a header?官方文档的page events部分还有许多其他示例。