从交互式表单 pdf 中获取姓名字段

Posted

技术标签:

【中文标题】从交互式表单 pdf 中获取姓名字段【英文标题】:Get name's field from interactive form pdf 【发布时间】:2015-02-19 07:51:35 【问题描述】:

早安,

我不知道,我如何阅读 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();
        

谢谢帮助

【问题讨论】:

【参考方案1】:

您共享的表单是纯 XFA 表单。 XFA 代表 XML 表单架构。

请阅读The Best iText Questions on *** 并滚动到标题为“交互式表单”的部分。

这是本节的前两个问题:

How to fill out a pdf file programmatically? (AcroForm technology) How to fill out a pdf file programmatically? (Dynamic XFA)

您正在填写表单,就好像它是基于 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截取)可以看出,表单中没有这样的字段:

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

更新:

所以...您决定发表评论,要求我代替您完成您的工作,询问在哪里可以找到示例代码?我提供了XfaMovie 和XfaMovies 的链接。

好吧,这里有两个新的例子:

ReadXFA 接受xfa_form_poland.pdf 并以data.xml 作为结果读取数据。 FillXFA2 接受 xfa_form_poland.pdf 并用 xfa_form_poland.xml 填充它,得到 xfa_form_poland_filled.pdf

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

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

【讨论】:

你有任何例子吗,我可以在哪里找到示例代码。简单地说,我需要一些文本字段的文本以 pdf 形式。 你说“任何类似于 i 的程序”是什么意思? 你能推荐我吗,任何类似于 iText RUPS 的程序。我不太确定,但是这个程序给我剪了一些代码。例如,我在 pdf 文档 (identyfikator podakowy NIP podmiotu) 中找不到源代码,如果我可以要求帮助你。十式(10. Identyfikator podatkowy 并选择 Field NIP 并在此字段附近写下 nip 编号) 我会更新我的答案。你是学生吗?您的问题听起来不像是开发人员。 你知道***的概念吗?如果有人给你一个正确的答案(我做了),你接受这个答案。

以上是关于从交互式表单 pdf 中获取姓名字段的主要内容,如果未能解决你的问题,请参考以下文章

根据选择添加 adobe 元素

从 PDF 表单中提取 PDF 表单字段名称

如何使用 Delphi 将数据从 XML 导入 PDF 表单?

电子邮件表单交互

更新谷歌地图会从表单元素中窃取焦点

无论如何使用iText保存交互式pdf?