简体   繁体   English

PdfPTable作为iTextSharp中的标题

[英]PdfPTable as a header in iTextSharp

I need a table with about 12 cells to display as a header. 我需要一个包含大约12个单元格的表格作为标题显示。 The following code fails to do this. 以下代码无法执行此操作。 I am aware table2 does not have 12 cells. 我知道table2没有12个单元格。 On the second page, only "testing" is displayed. 在第二页上,仅显示“测试”。 What am I missing? 我错过了什么?

Thanks in advance! 提前致谢!

Document document = new Document();

        try
        {
            PdfWriter.GetInstance(document, new FileStream("TableTest.pdf", FileMode.Create));
            document.Open();

            PdfPTable table = new PdfPTable(1);
            table.WidthPercentage = 100;
            PdfPTable table2 = new PdfPTable(2);

            //logo
            PdfPCell cell2 = new PdfPCell(Image.GetInstance(@"C:\path\to\file.gif"));
            cell2.Colspan = 2;
            table2.AddCell(cell2);

            //title
            cell2 = new PdfPCell(new Phrase("\nTITLE TEXT", new Font(Font.HELVETICA, 16, Font.BOLD | Font.UNDERLINE)));
            cell2.HorizontalAlignment = Element.ALIGN_CENTER;
            cell2.Colspan = 2;
            table2.AddCell(cell2);

            PdfPCell cell = new PdfPCell(table2);
            table.HeaderRows = 1;
            table.AddCell(cell);
            table.AddCell(new PdfPCell(new Phrase("")));

            document.Add(table);

            document.Add(new Phrase("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ntesting"));
        }
        catch (DocumentException de)
        {
            Console.Error.WriteLine(de.Message);
        }
        catch (IOException ioe)
        {
            Console.Error.WriteLine(ioe.Message);
        }

        document.Close();

Bingo! 答对了! PdfPageEventHandler class worked for me. PdfPageEventHandler类为我工作。

I used the PdfPageEventHelper overriding the OnEndPage method: 我使用PdfPageEventHelper重写OnEndPage方法:

class _events : PdfPageEventHelper
{
    public override void OnEndPage(PdfWriter writer, Document document)
    {
        PdfPTable table = new PdfPTable(1);
        //table.WidthPercentage = 100; //PdfPTable.writeselectedrows below didn't like this
        table.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin; //this centers [table]
        PdfPTable table2 = new PdfPTable(2);

        //logo
        PdfPCell cell2 = new PdfPCell(Image.GetInstance(@"C:\path\to\file.gif"));
        cell2.Colspan = 2;
        table2.AddCell(cell2);

        //title
        cell2 = new PdfPCell(new Phrase("\nTITLE", new Font(Font.HELVETICA, 16, Font.BOLD | Font.UNDERLINE)));
        cell2.HorizontalAlignment = Element.ALIGN_CENTER;
        cell2.Colspan = 2;
        table2.AddCell(cell2);

        PdfPCell cell = new PdfPCell(table2);
        table.AddCell(cell);

        table.WriteSelectedRows(0, -1, document.LeftMargin, document.PageSize.Height - 36, writer.DirectContent);
    }
}

then, build pdf 然后,建立pdf

Document document = new Document(PageSize.A4, 36, 36, 36 + <height of table>, 36); // note height should be set here
_events e = new _events();
PdfWriter pw = PdfWriter.GetInstance(document, new FileStream("TableTest.pdf", FileMode.Create));
pw.PageEvent = e;
document.Open();

for(int i=0;i<100;i++)
{
    document.Add(new Phrase("TESTING\n"));
}

document.Close();

I used aa very simple approach to add a header row on each page, when creating a PdfPTable with 'n' rows, where 'n' could any integer. 当使用'n'行创建PdfPTable时,我使用了一种非常简单的方法在每个页面上添加标题行,其中'n'可以是任何整数。 I am using iTextSharp 4.0.4.0. 我正在使用iTextSharp 4.0.4.0。

So, you could create a table with 1000 rows or 2 rows or 5000 rows, but iTextSharp will automatically page the output for you. 因此,您可以创建一个包含1000行或2行或5000行的表,但iTextSharp会自动为您输出页面。 What iTextSharp will not do is automatically add a header to start of every page. iTextSharp不会做的是自动添加标题以开始每个页面。

In order to add a header row for every page, all I did was add the single line of code after creating the PdfPTable with all its rows and cells , and then iTextSharp automatically paged the output with a header row. 为了为每个页面添加标题行,我所做的只是在创建包含其所有行和单元格的PdfPTable后添加单行代码 ,然后iTextSharp自动将输出分页为标题行。 'table' is the instance of PdfPTable that I created in my code before setting its HeaderRows property. 'table'是我在设置其HeaderRows属性之前在我的代码中创建的PdfPTable的实例。

table.HeaderRows = 1; //this will automatically insert a header row 
                      //at start of every page. The first row you created
                      //in your code will be used as the header row in this case.

This will not work if you have more than one page. 如果您有多个页面,这将无效。 If you have more than one page, then you need to use the OnStartPage event instead of the onEndPage event. 如果您有多个页面,则需要使用OnStartPage事件而不是onEndPage事件。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM