PdfPTable в качестве заголовка в iTextSharp - PullRequest
5 голосов
/ 23 февраля 2010

Мне нужна таблица с примерно 12 ячейками для отображения в качестве заголовка. Следующий код не может сделать это. Я знаю, что table2 не имеет 12 ячеек. На второй странице отображается только «тестирование». Чего мне не хватает?

Заранее спасибо!

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();

Ответы [ 3 ]

11 голосов
/ 24 февраля 2010

Бинго! Класс PdfPageEventHandler работал для меня.

Я использовал 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);
    }
}

затем сборка 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();
1 голос
/ 18 марта 2014

Я использовал очень простой подход для добавления строки заголовка на каждую страницу, когда создавал PdfPTable со строкой 'n', где 'n' может быть любым целым числом. Я использую iTextSharp 4.0.4.0.

Таким образом, вы можете создать таблицу с 1000 строками или 2 строками или 5000 строками, но iTextSharp автоматически выведет на экран вывод для вас. Что iTextSharp не сделает, так это автоматически добавит заголовок к началу каждой страницы.

Чтобы добавить строку заголовка для каждой страницы, все, что я сделал, это добавил одну строку кода после создания PdfPTable со всеми его строками и ячейками , а затем iTextSharp автоматически разбил на выходные данные строка заголовка. 'table' - это экземпляр PdfPTable, который я создал в своем коде перед установкой его свойства HeaderRows.

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.
0 голосов
/ 17 августа 2011

Это не будет работать, если у вас более одной страницы. Если у вас более одной страницы, вам нужно использовать событие OnStartPage вместо события onEndPage.

...