У меня есть локальная форма PDF с определенным шаблоном, который никогда не меняется. Я идентифицировал форму как динамическую форму XFA (xml), так как наборы ключей не были возвращены. Я пытаюсь использовать itext для заполнения формы данными, содержащимися в файле .txt. Насколько я понимаю, мне нужно каким-то образом получить данные из текстового файла и правильно поместить их в файл .xml. файл, чтобы itext мог манипулировать исходным PDF-файлом, используя данный xml.
В качестве примера форма имеет следующий вид:
Пример кода, который я использую в Eclipse, успешно компилируется/запускается, но ему требуются данные в файле data.xml
, чтобы заполнить пустую форму данными поля и вывести заполненную версию. Дело в том, что для моего реального проекта у меня нет файла data.xml для правильного заполнения формы. Необработанные данные поля находятся в файле .txt, где каждая строка содержит данные для разных полей в PDF.
ПРИМЕР: Ссылаясь на изображение выше, мой файл .txt выглядит следующим образом для полей до и включая поле с пометкой «ЧЕТЫРЕ»:
- Джон
- 15
- Чернить
- Хонда
- Тойота
- Форд
- БМВ
Меня смущают две вещи:
1. Как извлечь XML-структуру исходного PDF-файла, чтобы знать формат, которого следует придерживаться при заполнении данных из файла .txt?
2. Как мне получить значения из текстового файла и правильно вставить их в структуру .xml?
Следующий код работает, но требует data.xml
для заполнения «incomplete.pdf». Он использует код xfa.fillXfaForm(new FileInputStream(XML));
для ввода данных, но я застрял на том, как определить структуру для «XML» и как ее заполнить в первую очередь.
Любая помощь приветствуется, большое спасибо.
Код:
package sandbox;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Set;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.XfaForm;
public class FillXFA {
public static final String SRC = "C:/Workspace/PDF/incomplete.pdf";
public static final String XML = "C:/Workspace/PDF/data.xml";
public static final String DEST = "C:/Workspace/PDF/completed.pdf";
public static void main(String[] args) throws IOException, DocumentException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new FillXFA().manipulatePdf(SRC, DEST);
}
public void readXfa(String src, String dest)
throws IOException, ParserConfigurationException, SAXException,
TransformerFactoryConfigurationError, TransformerException {
FileOutputStream os = new FileOutputStream(dest);
PdfReader reader = new PdfReader(src);
XfaForm xfa = new XfaForm(reader);
Document doc = xfa.getDomDocument();
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.transform(new DOMSource(doc), new StreamResult(os));
reader.close();
}
public void manipulatePdf(String src, String dest)
throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader,
new FileOutputStream(dest));
AcroFields form = stamper.getAcroFields();
XfaForm xfa = form.getXfa();
xfa.fillXfaForm(new FileInputStream(XML));
stamper.close();
reader.close();
}
}