pdf-generation - 如何从 "complex"XML 文件创建标记的 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="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>

最佳答案

我的队友想出了解决这个问题的办法。这个想法是创建一个 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);

关于pdf-generation - 如何从 "complex"XML 文件创建标记的 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9407671/

相关文章:

c# - 为razorpdf mvc添加水印

linux - 通过书签拆分 PDF?

python - ReportLab:如何对齐文本对象?

grails - 无法使用 grails 渲染插件加载 CSS

python - ReportLab - 无法屏蔽图像 [Google App Engine]

latex - pandoc LaTex 改变`反引号高亮

java - 使用 iText : form values not visible PdfCopy 和表单值

java - iText:使用 Xmp 在元数据中自定义 Xml 标签