Как изменить ячейку заголовка при изменении страницы?

У меня есть PdfPTable в моем документе, написанном с использованием iTextSharp. Есть некоторые строки заголовков, которые повторяются всякий раз, когда таблица переполняется на другую страницу. Одна из этих строк содержит ячейку с текстом, например. "Джон Доу".

Я хочу, чтобы этот текст менялся на «Джон Доу (продолжение)» на каждой последующей странице. Насколько я могу судить, мне нужно что-то сделать в событии OnEndPage, которое каким-то образом манипулирует экземпляром ячейки заголовка для этой страницы, но я изо всех сил пытаюсь выяснить, как именно найти ячейку в письменном содержимом, а затем манипулировать ею. .

Как мне достичь этой цели?


person Jeff Yates    schedule 31.05.2013    source источник
comment
Интересно, почему минус. Два в один день по несвязанным вопросам. Кажется немного странным.   -  person Jeff Yates    schedule 01.02.2016


Ответы (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();
person Jeff Yates    schedule 03.06.2013

Использование onEndPage() может сработать, но я бы реализовал интерфейс PdfPTableEventSplit на вашем месте. Я бы использовал переменную-член cellContent и установил для нее значение "John Doe" при создании экземпляра события. Я бы нарисовал содержимое cellContent в методе tableLayout() и изменил его содержимое на "John Doe (continued)" в методе splitTable().

Попробуйте и поделитесь своим кодом. Если это сработает, другим будет оказана помощь; если это не так, я посмотрю, что пойдет не так (но, пожалуйста, поймите, что я не разработчик C#; я написал iText на Java; мне пришлось нанять людей, чтобы перенести его на C#).

person Bruno Lowagie    schedule 01.06.2013
comment
Спасибо! Я попробую. - person Jeff Yates; 02.06.2013
comment
Итак, я смотрел на это, но, к сожалению, я не могу использовать этот подход, поскольку мы используем v4.1.2 iTextSharp, и поэтому PdfPTableEventSplit недоступен. Я подозреваю, что это отлично сработает, если у меня будет доступ к более новой версии, но из-за условий AGPL мы не можем этого сделать. - person Jeff Yates; 03.06.2013
comment
Ой, 31 тысяча репутации и охотно работают с устаревшим, устаревшим софтом... Как это возможно? - person Bruno Lowagie; 03.06.2013
comment
AGPL означает, что мы не можем использовать его в нашем коммерческом программном обеспечении, не открывая весь исходный код, чего мы не можем сделать. Итак, мы застряли на последней версии до применения AGPL. - person Jeff Yates; 03.06.2013
comment
Это узкая интерпретация AGPL. Многие ваши конкуренты покупают лицензию, чтобы освободиться от обязательства открывать исходный код всего своего продукта. Это справедливо, не так ли? - person Bruno Lowagie; 03.06.2013
comment
Конечно. Однако это то, что я не могу контролировать в данный момент, поэтому я должен работать в рамках параметров нашей текущей настройки. Ази-эс-ла-вида. - person Jeff Yates; 03.06.2013