早上好,
我不知道,我怎样才能阅读pdf下方的字段名称表格。 我使用了AcroFields的所有方法,但所有方法都返回0或null http://www.finanse.mf.gov.pl/documents/766655/1481810/PIT-8C(7)_v1-0E.pdf
我的代码:
try {
PdfReader.unethicalreading = true;
PdfReader reader = new PdfReader(new FileInputStream("/root/TestPit8/web/notmod.pdf"));
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("/root/TestPit8/web/testpdf.pdf"));
AcroFields form = stamper.getAcroFields();
form.setField("text_1", "666");
form.setField("text_2", "666");
form.setField("text_3", "666");
form.setFieldProperty("text_3", "clrfflags", TextField.PASSWORD, null);
form.setFieldProperty("text_3", "setflags", PdfAnnotation.FLAGS_PRINT, null);
form.setField("text_3", "12345678", "xxxxxxxx");
form.setFieldProperty("text_4", "textsize", new Float(12), null);
form.regenerateField("text_4");
stamper.close();
reader.close();
} catch( Exception ex) {
ex.printStackTrace();
}
Thx forhelp
答案 0 :(得分:3)
您分享的表单是纯XFA表单。 XFA代表XML Forms Architecture。
请阅读The Best iText Questions on StackOverflow并滚动到标题为"互动表格"的部分。
这是本节的前两个问题:
您正在填写表单,就像它基于AcroForm技术一样。这不应该起作用,是吗?您的表格是XFA表格!
在我的书中,XfaMovies示例中解释了填写XFA表单:
public void manipulatePdf(String src, String xml, 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();
}
在这种情况下,src
是原始表单的路径,xml
是XML数据的路径,dest
是填写表单的路径。
如果您想读取数据,则需要XfaMovie示例:
这将读取完整表格(所有XFA):
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();
}
如果您只想要数据,则需要检查datasets
节点:
public void readData(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);
Node node = xfa.getDatasetsNode();
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
if("data".equals(list.item(i).getLocalName())) {
node = list.item(i);
break;
}
}
list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
if("movies".equals(list.item(i).getLocalName())) {
node = list.item(i);
break;
}
}
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.transform(new DOMSource(node), new StreamResult(os));
reader.close();
}
请注意,我不明白为什么您认为表单中有text_1
,text_2
等字段。 XFA字段很容易识别,因为它包含大量[]
个字符。
另外:从下面的屏幕截图(用iText RUPS拍摄)中,很明显表格中没有这样的字段:
这些工具在iText网站上。文档就在那里。请使用它!
<强>更新强>
所以...不是接受我的全面答案,你决定发表评论,要求我在你的位置通过询问哪里可以找到示例代码来完成你的工作?尽管事实如此我提供了XfaMovie和XfaMovies的链接。
嗯,这里有两个新的例子:
当然:我不懂波兰语,所以我并不总是填写正确的值,但现在至少你没有理由要求我可以在哪里找到示例代码?
更新2:
在额外的评论中,您声称无法在数据结构中的任何位置找到NIP号码(表单中的数字10)。
这意味着您尚未检查data.xml,或者您不了解XML。
请允许我显示包含NIP号码的XML的相关部分:
<Deklaracja xmlns="http://crd.gov.pl/wzor/2014/12/05/1880/" xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2011/06/21/eD/DefinicjeTypy/">
....
<Podmiot2 rola="Podatnik">
<etd:OsobaFizyczna>
<etd:NIP>0123456789</etd:NIP>
<etd:ImiePierwsze>JUST TRY</etd:ImiePierwsze>
<etd:Nazwisko>DUDE</etd:Nazwisko>
<etd:DataUrodzenia>2015-02-19</etd:DataUrodzenia>
</etd:OsobaFizyczna>
</Podmiot2>
...
</Deklaracja>
换句话说,您正在寻找的字段名称可能是这样的:Deklaracja[0].Podmiot2[0].OsobaFizyczna[0].NIP[0]
(无论这些字是什么意思,我只知道一个波兰语单词:Podpis)。