我有一个本地 PDF 表单,它有一个永远不会改变的特定模板。我已将该表单标识为 XFA (xml) 动态表单,因为没有返回任何键集。我正在尝试使用 itext 使用 .txt 文件中包含的数据填写表单。据我了解,我需要以某种方式从文本文件中获取数据并将其正确放入 .xml 文件中,以便 itext 可以使用给定的 xml 操作原始 PDF。
该表单具有以下布局示例:
我在 Eclipse 中使用的示例代码编译/运行成功,但它需要文件data.xml
中的数据才能用字段数据填充空表单并输出填充的版本。问题是,对于我的实际项目,我没有用于正确填充表单的 data.xml 文件。原始字段数据位于 .txt 文件中,每行包含 PDF 中不同字段的数据。
示例:参考上面的图片,我的 .txt 文件看起来像这样,直到并包括标记为“FOUR”的字段:
- 约翰
- 15
- 黑色的
- 本田
- 丰田
- 福特
- 宝马
我对两件事感到困惑:
1.如何提取原始 PDF 的 xml 结构,以便在使用 .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();
}
}