解析HTML片段并添加到PdfPTable

时间:2014-11-04 21:22:29

标签: java itext xmlworker

我正在创建一个由几个PdfPTable组成的PDF,其中一些PdfCell由简单的短语组成,其他的则需要解析HTML片段。为了确保解析的HTML添加了所需的样式并且在正确的位置,我将其存储在Paragraph中,然后将其添加到PdfPCell。但是这样做会导致我在处理列表和引号等HTML标记时遇到问题。下面是我正在做的一个粗略的例子,我该怎么做才能正确处理HTML列表,引号等?

例如:iText正确处理HTML列表并知道将其转换为iText List / ListItem。我需要将该List添加到我的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;
}

1 个答案:

答案 0 :(得分:0)

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

像这样创建你的单元格:

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

您正在使用PdfPCell方法隐式创建addCell()实例。您将Paragraph传递给此方法,但此Paragraph已投放到Phrase。当您使用PdfPCell隐式创建Phrase时,Phrase中存在的所有内容都将降级为纯文本元素。