2013-11-06 2 views
1

Я создаю pdf, где название каждой страницы pdf будет настроено на основе текущего номера страницы. Например, на первой странице заголовок «Первая страница», а на второй странице заголовок «Вторая страница» и т. Д.PdfPageEventHelper в iText

Что мы делаем сейчас, мы добавляем заголовок в PdfPTable , то мы добавим много других вещей в PdfPTable, так что этот PdfPTable содержит несколько страниц данных. Наконец, мы добавляем этот большой объект PdfPTable для документирования. Теперь мы хотим использовать метод onStartPage() в PdfPageEventHelper, чтобы получить текущий номер страницы, чтобы мы могли настроить заголовок для каждой страницы.

Проблема заключается в том, что объект onStartPage() не запускается, пока мы не добавим этот большой объект PdfPTable к документу, а это значит, что мы не можем сделать набор ресурсов для загрузки разных значений ключа до того, как объект PdfPTable будет добавлен в документ, не так ли? Любое предложение реализовать это?

-------------------- У нас есть коды, как показано ниже --------------------- ----------------

Phrase title = new Phrase(); 
    title.add(new Chunk(bundle.getString(pdfNewPageEventHandler.getKey()), headerFont)); 
    PdfPCell cell = new PdfPCell(new Paragraph(
      new Phrase(title))); 
    ......... 
    PdfPTable table = new PdfPTable(tableSize); 
    table.addCell(cell); 
    ......... 
    document.add(table); 




private class PdfNewPageEventHandler extends PdfPageEventHelper { 

    private int currentPageNum = 0; 
    private String key; 

    @Override 
    public void onStartPage(PdfWriter writer, Document document) { 

     currentPageNum = currentPageNum + 1; 

     if (currentPageNum == 1) { 
      key = "firstPage"; 
     } 
     else if (currentPageNum == 2) { 
      key = "secondPage"; 
     } 

    } 

    public String getKey() { 
     return key; 
    } 

} 
+0

Возможно, вы захотите добавить это название на страницу в событии onEndPage в том же прослушивателе. – mkl

ответ

0

У меня есть более одного ответа. Я не знаю, какой из них относится к вашей конкретной ситуации:

  1. Никогда не добавлять содержимое в методе onStartPage(). Как указано, все содержимое должно быть добавлено в методе onEndPage().

  2. Не всегда полезно создать одну большую таблицу (она создается в памяти), а затем добавить таблицу в документ (только в этот момент память может быть освобождена). Возможно, вы захотите попробовать некоторые из стратегий большого стола из документации.

  3. В некоторых случаях создание таблицы в памяти и добавление ее в документ - единственная стратегия, которую вы можете использовать. Затем iText будет распространять содержимое таблицы на разные страницы, вызывая события страницы. Однако: если вы хотите инициировать события, характерные для таблицы, вы также можете определять события на уровне таблицы. Для этой цели есть PdfPTableEventSplit и PdfPTableEventAfterSplit.

Образец кода, который вы предоставили, на самом деле не иллюстрирует проблему. Не могли бы вы перефразировать проблему, поскольку я не уверен, что какой-либо из моих ответов перейдет к сути проблемы.

+0

спасибо, чувак! Я, наконец, решил проблему, сохранив некоторое пространство для каждой страницы, а затем добавив настраиваемый заголовок в абсолютную позицию в методе onEndPage(). –

Смежные вопросы