Pdf generation 如何从“创建带标签的PDF”;复杂的;XML文件

Pdf generation 如何从“创建带标签的PDF”;复杂的;XML文件,pdf-generation,itext,tagged-pdf,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="

我有一个复杂的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>

2001年:太空漫游
斯坦利库布里克
大不列颠联合王国
美国

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

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

if(node is a leaf) PdfStructureElement element=(PdfStructureElement)node.getUserObject(); canvas.beginMarkedContentSequence(element); else canvas.beginMarkedContentSequence(qName); if(节点是叶) PDFSStructureElement=(PDFSStructureElement)节点。getUserObject(); canvas.beginMarkedContentSequence(元素); 其他的 canvas.beginMarkedContentSequence(qName);