从交互式表格pdf获取名称字段

时间:2015-02-19 07:51:36

标签: itext

早上好,

我不知道,我怎样才能阅读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

1 个答案:

答案 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_1text_2等字段。 XFA字段很容易识别,因为它包含大量[]个字符。

另外:从下面的屏幕截图(用iText RUPS拍摄)中,很明显表格中没有这样的字段:

enter image description here

这些工具在iText网站上。文档就在那里。请使用它!

<强>更新

所以...不是接受我的全面答案,你决定发表评论,要求我在你的位置通过询问哪里可以找到示例代码来完成你的工作?尽管事实如此我提供了XfaMovieXfaMovies的链接。

嗯,这里有两个新的例子:

当然:我不懂波兰语,所以我并不总是填写正确的值,但现在至少你没有理由要求我可以在哪里找到示例代码?

更新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)。