如何从“复杂”XML文件创建标记PDF

时间:2012-02-23 05:26:51

标签: pdf-generation itext tagged-pdf

我有一个复杂的XML文档。我使用iText库从这个XML文档中创建了一个标记的PDF。我已经参考了iText in Action一书的第15章中的例子,但是它们仅限于一个简单的XML文件,其层次结构只有一层深度。

如何扩展适用于平面结构的算法,以便它可以处理这种分层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 个答案:

答案 0 :(得分:1)

我的队友想出了解决这个问题的方法。我们的想法是创建一个DefaultMutableTreeNode元素树。每个DefaultMutableTreeNode都包含一个PdfStructureElement。树应该表示XML层次结构,例如,考虑前一个注释中的XML代码段。第一个DefaultMutableTreeNode应该有一个PdfStructureElement(PdfName - movies),其父级是writer.getStructureTreeRoot()。此节点的子节点应该是另一个PdfStructureElement(PdfName - movie),其父节点是名为“movies”的PdfStrucutreElement,依此类推。

完成上述步骤(基本上是结构解析)后,我们得到一个PdfStrucutreElements树。现在,我们必须解析内容。在我们解析内容时,我们需要遍历每个树节点。如果解析的节点是叶节点,那么我们需要在该节点内获取PdfStructureElement。否则,如果解析的节点是非叶节点,那么我们需要在该节点内获取PdfStructureElement的PdfName。换句话说,我们可以简单地使用qName变量。

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