【问题标题】:Parsing HTML snippets and adding to PdfPTable解析 HTML 片段并添加到 PdfPTable
【发布时间】:2014-12-31 22:35:21
【问题描述】:

我正在创建一个由几个 PdfPTables 组成的 PDF,其中一些 PdfCell 由简单的短语组成,而另一些则需要解析 HTML sn-ps。为了确保已解析的 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;
}

【问题讨论】:

  • XMLWorkerHelper 是真正解析 HTML 还是只解析 XML?因为除非是 XHTML,否则 HTML 不是有效的 XML。

标签: java itext xmlworker


【解决方案1】:

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

像这样创建你的单元格:

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

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

【讨论】:

  • 呃,谢谢!刚刚在我的项目上工作时看到了隧道,错过了明显的答案
猜你喜欢
  • 1970-01-01
  • 2014-02-07
  • 2023-03-09
  • 1970-01-01
  • 2011-02-19
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
相关资源
最近更新 更多