Как изменить ячейку заголовка при изменении страницы?
У меня есть PdfPTable
в моем документе пишется с использованием iTextSharp. Есть несколько строк заголовка, которые повторяются всякий раз, когда таблица переполняется на другую страницу. Одна из этих строк содержит ячейку с текстом, например "Джон Доу".
Что я хочу, чтобы этот текст был изменен на "Джон Доу (продолжение)" на каждой последующей странице. Из того, что я могу сказать, мне нужно сделать что-то в OnEndPage
событие, которое каким-то образом манипулирует экземпляром ячейки заголовка для этой страницы, но я изо всех сил пытаюсь выяснить, как именно найти ячейку в письменном содержимом, а затем манипулировать ею.
Как мне достичь этой цели?
2 ответа
После некоторых проб и ошибок я смог получить рабочее решение. Я реализовал IPdfCellEvent
который объявляет один метод, CellLayout
, Согласно документации iText, она вызывается после визуализации ячейки, что означает, что при первом вызове она отображала ячейку для самой первой страницы таблицы. Поэтому я использую этот вызов, чтобы добавить дополнительный текст, чтобы во всех последующих визуализациях был добавлен дополнительный текст.
Это моя реализация интерфейса:
private class ContinuedCellEvent : IPdfPCellEvent
{
public void CellLayout( PdfPCell cell, Rectangle position, PdfContentByte[] canvases )
{
if ( !_continuationApplied )
{
// This is called AFTER cell rendering so this should set the cell for the next time it is rendered
// which will always be on a continuation.
cell.Phrase.Add( new Chunk( " Continued" ) );
_continuationApplied = true;
}
}
private bool _continuationApplied;
}
Используется при определении ячейки:
cell.CellEvent = new ContinuedCellEvent();
С помощью onEndPage()
может работать, но я бы реализовал PdfPTableEventSplit
интерфейс на вашем месте. Я бы использовал членскую переменную cellContent
и установите его "John Doe"
при создании экземпляра события. Я бы нарисовал содержание cellContent
в tableLayout()
метод и изменить его содержание "John Doe (continued)"
в splitTable()
метод.
Попробуйте и поделитесь своим кодом. Если это сработает, другим помогут; если этого не произойдет, я посмотрю, что происходит не так (но, пожалуйста, поймите, что я не разработчик C#; я написал iText на Java; мне пришлось нанять людей, чтобы перенести его на C#).