Извлечь xdp или xfa из PDF
Я создал PDF-форму с помощью Adobe LiveCycle Designer. Сейчас я пытаюсь программно извлечь данные из PDF после того, как они были заполнены.
Я пытался сделать это с помощью poppler (привязка qt4, но я думаю, это не имеет значения), но, очевидно, poppler не может обрабатывать формы XFA. Хотя evince и okular умеют отображать форму...
Насколько я понимаю, PDF содержит XDP, который, в свою очередь, содержит форму XFA. У меня вопрос, как я могу извлечь эти данные из PDF?
Если есть библиотеки, я могу выбрать C++, java, python или PHP.
1 ответ
Документ XML (в формате XDP), который составляет XFA, сохраняется как значение ключа XFA в словаре AcroForm (Интерактивный словарь форм). На словарь AcroForm ссылаются из словаря каталога (корень документа PDF).
Значение XFA может быть потоком или массивом потоков. Если это поток, он содержит весь документ XML. Если это массив, разные потоки содержат отдельные пакеты XDP. Их объединение даст полный XML-документ.
Одним из пакетов XDP является пакет dataSets. Фактические данные формы будут в дочернем элементе этого пакета: xfa: data. Пример:
<xfa:dataSets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">
<xfa:data>
<!-- arbitrary XML data, e.g.: -->
<Employee>
<FirstName>John</FirstName>
<Name>Doe</Name>
</Employee>
</xfa:data>
</xfa:dataSets>
Любая библиотека PDF, которая предлагает низкоуровневый доступ к объектам PDF, может использоваться для извлечения документа XML. Просто перейдите через Каталог > AcroForm > XFA.
Некоторые библиотеки PDF могут предлагать более удобный метод.
(Отказ от ответственности: я сотрудник iText Software.) Например, используя iText (Java), вы можете просто сделать это, чтобы получить XFA как org.w3c.dom.Document
:
PdfReader reader = new PdfReader(pdfFile);
XfaForm xfa = reader.getAcroFields().getXfa();
org.w3c.dom.Document doc = xfa.getDomDocument();
Или просто получить пакет dataSets как org.w3c.dom.Node
:
org.w3c.dom.Node datasets = xfa.getDatasetsNode();