2013-05-31 5 views
1

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

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

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

+0

Интересно, почему downvote. Два в один день по несвязанным вопросам. Кажется немного странным. –

ответ

1

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

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

+0

Спасибо! Я попробую. –

+0

Итак, я смотрел на это, но, к сожалению, я не могу использовать этот подход, поскольку мы используем v4.1.2 iTextSharp и как таковой, PdfPTableEventSplit недоступен. Я подозреваю, что это будет отлично работать, если у меня будет доступ к более новой версии, но из-за условий AGPL мы не сможем этого сделать. –

+0

Ouch 31K репутация и охотно работает с устаревшим, устаревшим программным обеспечением ... Как это возможно? –

4

После некоторых проб и ошибок я смог получить рабочее решение. Я внедрил IPdfCellEvent, который объявляет один метод, CellLayout. Согласно iText documentation, это вызывается после того, как ячейка была отображена, что означает, что при первом вызове она отображает ячейку для самой первой страницы таблицы. Поэтому я использую этот вызов для добавления дополнительного текста, чтобы все последующие визуализации включали дополнительный текст.

Это моя реализация интерфейса:

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(); 
Смежные вопросы