2015-02-12 141 views
1

这是与List items in table cell are not formatted连接的主题。我使用XmlWorker处理来自格式表控件(Dojo的dijit/Editor)的HTML输出。还有一些块(当你使用定心或保证金格式化)这样的:将PdfDiv添加到段落

<div> 
    <p align="center"><font size="5"><b>&nbsp;<font color="#32cd32">My centered Para</font></b></font><font color="#32cd32">&nbsp;</font></p> 
</div> 

然而,当我将它们添加到Paragraph被添加到表喜欢这里:

PdfPCell htmlCell = new PdfPCell(); 
    htmlCell.setBackgroundColor(new BaseColor(213, 226, 187)); 
    htmlCell.addElement(html2Para(html)); 
    htmlCell.setPaddingBottom(5); 
    htmlCell.setPaddingLeft(5); 
    table.addCell(htmlCell); 

private Paragraph html2para(String html) { 
    final Paragraph para = new Paragraph(); 
    try { 
     XMLWorkerHelper.getInstance().parseXHtml(new ElementHandler() { 
      @Override 
      public void add(Writable wri) { 
       if (wri instanceof WritableElement) { 
        List<Element> elems = ((WritableElement) wri).elements(); 
        for (Element elem : elems) { 
         para.add(elem); 
        } 
       } 
      } 
     }, new StringReader(StringUtils.trimToEmpty(html))); 
    } catch (IOException e) { 
     log.error(e.getMessage(), e); 
    } 
    return para; 
} 

一切,在Element之内,即PdfDiv的实例不可见。

所以,当我满足PdfDiv,我添加它的内容:

private void addElem2para(Element elem, Paragraph target) { 
    if (elem instanceof PdfDiv) { 
     for (Element inside : ((PdfDiv)elem).getContent()) { 
      addElem2para(inside, target); 
     } 
    } else { 
     target.add(elem); 
    } 
} 

不过,现在像居中或保证金,格式化那名PdfDiv的属性是“丢失”。

应该如何处理来自XmlWorker的PdfDiv元素?

我在版本5.5.2

回答

2

(我认为)我明白你的问题,但我不明白你的代码利用iText和XmlWorker。

ParseHtml例子显示了如何理解你的问题:

StringBuilder sb = new StringBuilder(); 
sb.append("<div>\n<p align=\"center\">"); 
sb.append("<font size=\"5\">"); 
sb.append("<b>&nbsp;<font color=\"#32cd32\">My centered Para</font></b>"); 
sb.append("</font>"); 
sb.append("<font color=\"#32cd32\">&nbsp;</font>"); 
sb.append("</p>\n</div>"); 

PdfPTable table = new PdfPTable(1); 
PdfPCell cell = new PdfPCell(); 
ElementList list = XMLWorkerHelper.parseToElementList(sb.toString(), null); 
for (Element element : list) { 
    cell.addElement(element); 
} 
table.addCell(cell); 
document.add(table); 

你有一些HTML(我存储在sb你的HTML代码段)要解析成一系列的iText对象添加到表格单元格。

这是该操作的结果:

Screen shot

这看起来几乎是我所期望的方式。

+0

XMLWorkerHelper.parseToElementList是什么版本的库?我在5.5.2版本中看不到这种方法。我已经为我的问题添加了版本。 – 2015-02-12 08:54:24

+0

版本5.5.4。我添加了这个便捷方法,因为我厌倦了在StackOverflow的答案中反复复制/粘贴相同的代码序列。 – 2015-02-12 09:25:43

+0

好的,我测试过了。它大大改进了HTML的处理并将其置于独立段落中,但如果我将该段落添加到表格中,则必须滤除PdfDivs,因为它们的内容不会显示出来。 – 2015-02-12 10:09:29