1

我正在创建一个由几个 PdfPTables 组成的 PDF,其中一些 PdfCell 由简单的短语组成,而其他的则需要解析 HTML 片段。为了确保已解析的 HTML 添加了所需的样式并在正确的位置,我将其存储在段落中,然后将其添加到 PdfPCell。然而,这样做会导致我在处理一些 HTML 标记(如列表和引号)时遇到问题。下面是我正在做的一个粗略示例,我可以做些什么来正确处理 HTML 列表、引号等?

例如:iText 正确处理 HTML 列表并知道将其转换为 iText 列表/列表项。我需要将该列表添加到我的 PdfTable 中。我知道将列表元素放在段落中会取消正确的样式(整个列表最终在一行没有编号)并且想知道处理这个的正确方法

PdfPTable table = new PdfPTable(1);
    table.addCell(parseHtmlToParagraph(htmlString));
    table.addCell(new Phrase("Name" + user.getName()));

public Paragraph parseHtmlToParagraph(String str) throws IOException {
    StringReader body = new StringReader(str);
    final Paragraph para = new Paragraph();

    XMLWorkerHelper.getInstance().parseXHtml(new ElementHandler() {
        @Override
        public void add(Writable w) {
            if (w instanceof WritableElement) {
                List<Element> elements = ((WritableElement) w).elements();
                for (Element e : elements) {
                    para.add(e);
                }
            }
        }
    }, body);

    return para;
}
4

1 回答 1

0

答案很简单:您通过在文本模式下创建单元格而不是在复合模式下创建单元格来丢弃所有结构(例如列表结构)。

像这样创建你的单元格:

PdfPCell cell = new PdfPCell();
List<Element> elements = ((WritableElement) w).elements();
for (Element e : elements) {
     cell.addElement(e);
}

您正在PdfPCell使用该addCell()方法隐式创建一个实例。您将 a 传递Paragraph给此方法,但这Paragraph被强制转换为 a PhrasePdfPCell当您使用 a隐式创建 a时Phrase,其中存在的所有内容Phrase都将降级为纯文本元素。

于 2014-11-05T07:47:31.443 回答