【问题标题】:Header, footer and large tables with iTextSharp使用 iTextSharp 的页眉、页脚和大表格
【发布时间】:2012-04-09 12:11:25
【问题描述】:

我已经通过 PdfPageEventHelper 在我的文档中添加了页眉和页脚。

该文档有几个在运行时填充的“大”表。

我尝试通过“documen.Add(table)”简单地添加这些表格,但我的页眉和页脚结果被覆盖了。

我已经尝试了两种添加表格的方法(WriteSelectedRows 和 document.Add(myPdfPtable)。

PageEventHelper 的代码如下:

private class MyPageEventHandler : PdfPageEventHelper
{
        public iTextSharp.text.Image ImageHeader { get; set; }
        public iTextSharp.text.Image ImageFooter { get; set; }

        public override void OnEndPage(PdfWriter writer, Document document)
        {
            var fontintestazione = FontFactory.GetFont("Verdana", 10, Font.BOLD, BaseColor.LIGHT_GRAY);
            var fontRight = FontFactory.GetFont("Verdana", 8, Font.BOLD, BaseColor.WHITE);
            var fontFooter = FontFactory.GetFont("Verdana", 6, Font.NORMAL, BaseColor.BLUE);
            float cellHeight = document.TopMargin;
            Rectangle page = document.PageSize;
            PdfPTable head = new PdfPTable(3);
            head.TotalWidth = page.Width;

            PdfPCell c = new PdfPCell(ImageHeader, true);
            c.HorizontalAlignment = Element.ALIGN_LEFT;
            c.FixedHeight = cellHeight;
            c.Border = PdfPCell.NO_BORDER;
            head.AddCell(c);
             c = new PdfPCell(new Phrase("somePhrase", fontintestazione));
            c.Border = PdfPCell.NO_BORDER;
            head.AddCell(c);
            c = new PdfPCell(new Phrase("someTextBlah", fontRight));
            c.Border = PdfPCell.NO_BORDER;
            c.HorizontalAlignment = 1;
            c.BackgroundColor = new BaseColor(70, 130, 180);
            head.AddCell(c);
            head.WriteSelectedRows(0, -1, 10, page.Height - cellHeight + head.TotalHeight -30, writer.DirectContent);

            PdfPTable footer = new PdfPTable(2);
            footer.TotalWidth = 316f;
            float[] cfWidths = new float[] { 2f, 1f };
            footer.SetWidths(cfWidths);
            PdfPCell cf = new PdfPCell(ImageFooter, true);
            cf.HorizontalAlignment = Element.ALIGN_RIGHT;
            cf.FixedHeight = cellHeight;
            cf.Border = PdfPCell.NO_BORDER;
            footer.AddCell(cf);
            cf = new PdfPCell(new Phrase("someEndingText", fontFooter));
            cf.HorizontalAlignment = Element.ALIGN_LEFT;
            cf.Border = PdfPCell.NO_BORDER;
            footer.AddCell(cf);
            footer.WriteSelectedRows(0, -1, 10, 50, writer.DirectContent);
        }

在我的页面上,我只是这样做:

var document = new Document(PageSize.A4);

                var output = new MemoryStream();
                var writer = PdfWriter.GetInstance(document, output);
                iTextSharp.text.Image imageHeader = iTextSharp.text.Image.GetInstance(Server.MapPath("/images/header.ong"));
                iTextSharp.text.Image imageFooter = iTextSharp.text.Image.GetInstance(Server.MapPath("/images/footer.png"));
                MyPageEventHandler eve = new MyPageEventHandler
                {
                    ImageHeader = imageHeader ,
                    ImageFooter = imageFooter
                };
                writer.PageEvent = eve;
                document.Open();
//adding a table
PdfPTable cvTable = new PdfPtable(3);
cvTable.TotalWidth = document.PageSize.Width;
PdfPCell hCell = new PdfPCell(new Phrase("Jobs By User", aCustomFont));
cvTable.AddCell(hCell);
for(int i = 0; i < myTable.Records.Count; i++)
{
    PdfPCell idCell = new PdfPCell(new Phrase(myTable.Records[i]._id, aFont));
    cvTable.Add(idCell);
    //same stuff for other fields of table
}
//first attempt.... failed:
document.Add(cvTable) //<- header and footer are overwritten by table
//second attempt..... failed too...
cvTable.WriteSelectedRows(0, -1, 10, myPoisition, writer.DirectContent);
//kind of fail...:
//the table is large and need more pages. It is trunked on the first page and overwrite
//the footer.

【问题讨论】:

    标签: asp.net c#-4.0 itextsharp


    【解决方案1】:

    在您的 OnEndPage 方法中,您有这一行:

    head.WriteSelectedRows(0, -1, 10, page.Height - cellHeight + head.TotalHeight - 30, writer.DirectContent);
    

    该代码根据页面的高度和上边距正确计算放置内容的位置,但其中还包含一个神奇的30,它导致标题被绘制在表格的顶部。把它改成这个,你的标题就可以了。

    head.WriteSelectedRows(0, -1, 10, page.Height - cellHeight + head.TotalHeight, writer.DirectContent);
    

    我猜30 试图在您的标题和表格本身之间包含一些填充。我建议实际上在主代码中更改文档的边距:

    document.SetMargins(document.LeftMargin, document.RightMargin, document.TopMargin + 30, document.BottomMargin);
    

    然后在OnEndPage 方法中考虑:

    float cellHeight = document.TopMargin - 30;
    

    您的页脚代码实际上并没有考虑下边距,只是在50 处绘制它,因此这将始终重叠。快速解决方法是将其更改为:

    footer.WriteSelectedRows(0, -1, 10, footer.TotalHeight, writer.DirectContent);
    

    这至少会使页脚底部对齐。如果您想要更多像上面一样的填充,只需再次调整文档边距:

    document.SetMargins(document.LeftMargin, document.RightMargin, document.TopMargin + 30, document.BottomMargin + 30);
    

    【讨论】:

    • 你又一次帮助了我。谢谢克里斯! :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2015-03-04
    • 2013-09-30
    • 1970-01-01
    • 2011-05-07
    相关资源
    最近更新 更多