2015-02-04 3 views
0

У меня проблема с PDF, сгенерированная с помощью iText (версия 5.5.2). У меня есть таблица, которая должна содержать различные элементы, включая списки.Элементы списка в ячейке таблицы не отформатированы

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

Таким образом, вместо

  1. item1
  2. item2
  3. item3

Я получил

item1item2item3

Я использую следующий код:

private static Paragraph list(String... items) { 
    Paragraph para = new Paragraph(); 
    com.itextpdf.text.List list = new com.itextpdf.text.List(true, 10); 
    for (String item : items) { 
     list.add(new ListItem(item)); 
    } 
    para.add(list); 
    return para; 
} 

    document.add(list("item1","item2","item3)); 
    PdfPTable table = new PdfPTable(2); 
    table.addCell("Some list"); 
    table.addCell(list("item1","item2","item3)); 
    document.add(table); 

элемент, который добавляется к таблице идентична той, что добавляется к документу. Разница в том, что сначала отображается правильно, как список, а вторая не имеет форматирования списка.

Что я здесь делаю неправильно?

ответ

5

Вы добавляете List в режим PdfPTable в текста. Это никогда не сработает. Вы должны добавить List в композитный режим. Разница между режиме текста и композитного режима объясняется в ответ на следующие вопросы:

Если вы хотите найти более полезные ответы, объясняющие разницу между этими двумя концепциями, пожалуйста, скачайте бесплатную электронную книгу The Best iText Questions on StackOverflow (вот где я нашел lin k к вышеуказанным вопросам).

Я также искал sandbox examples on the official iText website и то, как я нашел ListInCell пример, показывающий много различных способов, чтобы добавить список в PdfPCell:

// We create a list: 
List list = new List();     
list.add(new ListItem("Item 1")); 
list.add(new ListItem("Item 2")); 
list.add(new ListItem("Item 3")); 

// We wrap this list in a phrase:  
Phrase phrase = new Phrase(); 
phrase.add(list); 
// We add this phrase to a cell 
PdfPCell phraseCell = new PdfPCell(); 
phraseCell.addElement(phrase);   

// We add the cell to a table: 
PdfPTable phraseTable = new PdfPTable(2); 
phraseTable.setSpacingBefore(5); 
phraseTable.addCell("List wrapped in a phrase:"); 
phraseTable.addCell(phraseCell); 

// We wrap the phrase table in another table: 
Phrase phraseTableWrapper = new Phrase(); 
phraseTableWrapper.add(phraseTable); 

// We add these nested tables to the document: 
document.add(new Paragraph("A list, wrapped in a phrase, wrapped in a cell, wrapped in a table, wrapped in a phrase:")); 
document.add(phraseTableWrapper); 

// This is how to do it: 

// We add the list directly to a cell: 
PdfPCell cell = new PdfPCell(); 
cell.addElement(list); 
// We add the cell to the table: 
PdfPTable table = new PdfPTable(2); 
table.setSpacingBefore(5); 
table.addCell("List placed directly into cell"); 
table.addCell(cell); 

Полученный PDF (list_in_cell.pdf) выглядит так, как я ожидайте.

Однако есть два предостережение:

  • Пример упоминание «Этот пример был написан Бруно Lowagie для потенциального клиента Код в данном примере работает с последней версией IText..Он не работает с версиями, предшествующими iText 5 «, и я не знаю, будет ли он работать с iText 5.5.2.
  • Я знаю, что вложенные списки не поддерживаются в таблицах. Поэтому, если вам нужен список внутри список внутри ячейки, вы получите результаты, которые не выглядят так, как вы этого хотите.
+2

ОК, так что моя проблема была, я думал, что table.addCell (Element) аналогичен созданию ячейки, добавление элемента в ячейку и добавление ячейки в таблицу .... –

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