table 单元格中的列表项未格式化
List items in table cell are not formatted
我对使用 iText(版本 5.5.2)生成的 PDF 有疑问。我有一个 table 应该包含各种元素,包括列表。
但是,单元格内的列表显示错误 - 它根本没有呈现为列表,而是列表项一个接一个地显示。
所以
- item1
- item2
- 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);
添加到 table 的元素与添加到文档的元素相同。区别在于,第一个正确显示为列表,第二个没有列表格式。
我哪里做错了?
您正在 文本模式 中将 List
添加到 PdfPTable
。那永远行不通。您应该在 复合模式 中添加 List
。 文本模式和复合模式之间的区别在以下问题的答案中解释:
- C# iTextSharp multi fonts in a single cell
- ...
如果您想找到更多有用的答案来解释这两个概念之间的区别,请下载免费电子书 The Best iText Questions on Whosebug(这是我找到上述问题的 link 的地方)。
我还搜索了 sandbox examples on the official iText website and that's how I found the 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) 看起来符合我的预期。
但是,有两个注意事项:
- 示例中提到了 "This example was written by Bruno Lowagie for a prospective customer. The code in this sample works with the latest version of iText. It doesn't work with versions predating iText 5",我不知道它是否适用于 iText 5.5.2。
- 我知道表格不支持嵌套列表。因此,如果您需要一个单元格内的列表中的列表,您将得到看起来不像您想要的结果。
我对使用 iText(版本 5.5.2)生成的 PDF 有疑问。我有一个 table 应该包含各种元素,包括列表。
但是,单元格内的列表显示错误 - 它根本没有呈现为列表,而是列表项一个接一个地显示。
所以
- item1
- item2
- 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);
添加到 table 的元素与添加到文档的元素相同。区别在于,第一个正确显示为列表,第二个没有列表格式。
我哪里做错了?
您正在 文本模式 中将 List
添加到 PdfPTable
。那永远行不通。您应该在 复合模式 中添加 List
。 文本模式和复合模式之间的区别在以下问题的答案中解释:
- C# iTextSharp multi fonts in a single cell
- ...
如果您想找到更多有用的答案来解释这两个概念之间的区别,请下载免费电子书 The Best iText Questions on Whosebug(这是我找到上述问题的 link 的地方)。
我还搜索了 sandbox examples on the official iText website and that's how I found the 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) 看起来符合我的预期。
但是,有两个注意事项:
- 示例中提到了 "This example was written by Bruno Lowagie for a prospective customer. The code in this sample works with the latest version of iText. It doesn't work with versions predating iText 5",我不知道它是否适用于 iText 5.5.2。
- 我知道表格不支持嵌套列表。因此,如果您需要一个单元格内的列表中的列表,您将得到看起来不像您想要的结果。