Как создать тегированный PDF из «сложного» XML-файла - PullRequest
3 голосов
/ 23 февраля 2012

У меня сложный XML-документ.Я использовал библиотеку iText для создания тегового PDF из этого XML-документа.Я сослался на примеры в 15-й главе книги «iText in Action», но они ограничены простым 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 Ответ

1 голос
/ 24 февраля 2012

Мой товарищ по команде придумал решение этой проблемы.Идея состоит в том, чтобы создать дерево элементов DefaultMutableTreeNode.Каждый из DefaultMutableTreeNode будет содержать PdfStructureElement.Дерево должно представлять иерархию XML, например, учитывать фрагмент кода XML в предыдущем комментарии.Первый DefaultMutableTreeNode должен иметь PdfStructureElement (PdfName - movies), чьим родителем является writer.getStructureTreeRoot ().Дочерним элементом этого узла должен быть другой PdfStructureElement (PdfName - movie), чьим родителем является PdfStrucutreElement с именем 'movies' и т. Д.

Как только упомянутые выше шаги выполнены (что по сути является разбором структуры), мы получаемдерево PdfStrucutreElements.Теперь нам нужно разобрать контент.Когда мы анализируем содержимое, нам нужно пройти через каждый из узлов дерева.Если анализируемый узел является листовым, то нам нужно получить элемент PdfStructureElement внутри этого узла.Иначе, если анализируемый узел является неконечным узлом, то нам нужно получить PdfName элемента PdfStructureElement в этом узле.Другими словами, мы можем просто использовать переменную qName.

</p> <pre> if(node is a leaf) PdfStructureElement element=(PdfStructureElement)node.getUserObject(); canvas.beginMarkedContentSequence(element); else canvas.beginMarkedContentSequence(qName); </pre> <p>

...