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

本文关键字:html 一个 表格 顶部 iTextsharp | 更新日期: 2023-09-27 18:03:37

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

  1. 页面顶部的表格(包括所有供应商信息)
  2. gridview (item of purchase)
  3. 签字部分(仅在发票最后一页)
到目前为止,我使用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表,因为它有很多东西需要控制,如不同的供应商,地址,显示/隐藏或取消图像。请帮助。

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

你的问题以前已经问过了。参见如何在页面中添加HTML页眉和页脚?在官方文档中,或者看看如何在页面中添加HTML页眉和页脚?StackOverflow。

Roman Sidorov的答案是错误的,因为Roman假设您正在从代码中触发NewPage()。这并不总是正确的。向Document添加一个表,该表跨越多个页面。这意味着ittext在内部触发NewPage()函数。

您可以通过使用页面事件向创建的每个页面添加内容。在执行NewPage()操作之前触发OnEndPage()事件。这是当您向当前页面添加额外内容时。OnStartPage()事件在执行NewPage()操作后立即触发。禁止在OnStartPage()事件中添加内容。查看iTextSharp -页眉和页脚

这是一个用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并将其添加到页面事件中的每个页面中呢?这是在回答问题的解释如何添加表作为标题?在官方文档的页面事件部分还有许多其他示例。