2012-02-23 103 views
2

我有一個複雜的XML文檔。我已經使用iText庫從這個XML文檔創建一個帶標籤的PDF。我已經參考了iText in Action書第15章中的例子,但它們僅限於一個簡單的XML文件,其層次結構只有一層。如何從「複雜」XML文件創建帶標籤的PDF

如何擴展與扁平結構一起工作的算法,以便它可以處理這種層次化的XML,如下面的示例中所示?

樣本 「情結」 的XML文檔:

<?xml version="1.0" encoding="UTF-8" ?> 
    <movies> 
     <movie duration="141" imdb="0062622" year="1968"> 
      <title>2001: A Space Odyssey</title> 
      <directors> 
       <director>Kubrick, Stanley</director> 
      </directors> 
      <countries> 
       <country>United Kingdom</country> 
       <country>United States</country> 
      </countries> 
     </movie> 
    </movies> 

回答

1

我的隊友想出了一個解決這個問題。這個想法是創建一個Tree DefaultMutableTreeNode元素。每個DefaultMutableTreeNode都將包含一個PdfStructureElement。例如,樹應代表XML層次結構,請考慮先前評論中的XML代碼片段。第一個DefaultMutableTreeNode應該有一個PdfStructureElement(PdfName - 電影),它的父級是writer.getStructureTreeRoot()。此節點的子節點應該是另一個PdfStructureElement(PdfName - 電影),其父級是名爲'movies'的PdfStrucutreElement等等。

一旦上述步驟完成(實質上是結構解析),我們得到一個PdfStrucutreElements樹。現在,我們必須解析內容。在解析內容時,我們需要遍歷每個樹節點。如果被解析的節點是葉節點,那麼我們需要在該節點內獲得PdfStructureElement。否則,如果被解析的節點是非葉節點,那麼我們需要獲取該節點內的PdfStructureElement的PdfName。換句話說,我們可以簡單地使用qName變量。

 
if(node is a leaf) 
    PdfStructureElement element=(PdfStructureElement)node.getUserObject(); 
    canvas.beginMarkedContentSequence(element); 
else 
    canvas.beginMarkedContentSequence(qName);