2014-11-04 75 views
1

我正在創建一個由幾個PdfPTables組成的PDF,其中一些PdfCell由簡單的短語組成,其他需要解析HTML片段。爲了確保解析的HTML添加了所需的樣式並在正確的位置,我一直將它存儲在段落中,然後將其添加到PdfPCell中。但是,這樣做會導致我在處理一些HTML標記(如列表和引號)時遇到問題。下面是我正在做的一個粗略的例子,我能做些什麼來正確處理HTML列表,引號等?解析HTML代碼片段並添加到PdfPTable

例如: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; 
} 
的正確方法
+0

XMLWorkerHelper實際上是解析HTML還是隻解析XML?因爲HTML不是有效的XML,除非它是XHTML。 – Falmarri 2014-11-04 21:33:44

回答

0

答案很簡單:通過在文本模式下創建單元格而不是在複合模式下創建單元格,即拋棄所有結構(如列表結構)。

這樣創建您的電池:

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

您都隱含使用addCell()方法創建一個PdfPCell實例。您正在向此方法傳遞Paragraph,但此Paragraph已轉換爲Phrase。當您隱式創建PdfPCellPhrase時,該Phrase中的所有內容將降級爲純文本元素。

+0

杜,謝謝!在對我的項目進行工作的同時,剛剛獲得隧道視野,並且錯過了明顯的答案 – UserAdamUser 2014-11-05 15:12:15