Заголовок, нижний колонтитул и большие таблицы с iTextSharp - PullRequest
6 голосов
/ 26 марта 2012

Я добавил заголовок и нижний колонтитул в свой документ PdfPageEventHelper.

В документе есть несколько "больших" таблиц, заполненных во время выполнения.

Я пытался добавить эти таблицыпросто "documentmen.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.

1 Ответ

13 голосов
/ 26 марта 2012

В вашем 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);
...