【问题标题】:How to export pdf form fields to xml automatically如何自动将pdf表单字段导出到xml
【发布时间】:2014-01-09 00:40:39
【问题描述】:

我有一个包含表单字段的pdf 文件,需要将数据导出到xml 文件中自动。这是我为测试创建的示例表单的屏幕:

注意:使用 Acrobat Professional 通过单击 Tools > Form > Export Form Data 并最终选择 xml 扩展名进行文件输出,手动导出效果很好。这是我手动导出时得到的结果:

<?xml version="1.0" encoding="UTF-8"?>
<fields>
    <first_name>John</first_name>
    <last_name>Doe</last_name>
</fields>

但是,我需要将其自动化,例如使用 python 脚本Java 实现 或一些命令行工具。有什么想法可以使用哪些库或工具将表单字段数据导出到xml?工具或库应该是开源,我可以将其集成到我的工作流程中。

我已经尝试过 python pdfminer 库,它帮助我导出 pdf 文件的静态部分(如 Static form headerFirst name:Last name:):但是如何导出表单字段数据(在我的情况下是表单字段first_namelast_name 的内容??

编辑:请随意下载 sample.pdf 文件here

【问题讨论】:

    标签: java xml python-2.7 acrobat pdf-extraction


    【解决方案1】:

    Apache PDFBox 怎么样?它是开源的,可以满足您的需求,因为网站上说“从 PDF 表单中提取表单数据或预填 PDF 表单”。

    编辑:查看PrintFields example

    【讨论】:

    • 看起来很棒!我尝试通过命令行提取所有表单字段并且它有效。明天我将研究 Java 源代码示例,但据我所知,这正是我所寻找的。我会及时通知你!
    • 我很高兴它有点帮助。我忘了说jdom library 可能是将对象转换为xml 的好方法。祝你好运!
    【解决方案2】:

    在 bash 中,您可以这样做(至少使用这些工具的我的版本,更少的 444 和 cat 8.13):

    less ~/Downloads/sample.pdf | cat
    

    我得到如下所示的输出:

    Static form header
    
    First name:   John
    
    Last name:    Doe
    

    然后您可以使用 Java/Python/awk/whatever 非常明显地解析它。

    当然,或者,如果您不想依赖这些特定版本的行为(不确定它们是否总是这样做),您可以查找 less's source code 以了解它是如何做到的。

    【讨论】:

    • 知道如何在 Windows 机器上执行此操作吗?
    • 你可以试试cygwin。或者,正如我在编辑中添加的那样,您可以查看其自身的功能,并尝试将该代码移植到 Windows。或者您可以安装 VMWare,启动 VM,让 VM 执行此操作,然后返回结果。或者您可以启动一个 EC2 实例,让 EC2 实例执行它,然后返回结果。
    • 感谢您的想法。我将检查源代码,看看我是否可以修改它。使用虚拟机还不是一种选择。我更喜欢在独立机器上运行的解决方案。
    • 我在 Adob​​e Acrobat DC 中填写了 PDF 的字段,但无法取出字段数据。答案刺痛在那里,但被二进制垃圾包围。在谷歌浏览器中填写相同的表格并打印为 PDF 文件,它具有可以检索的结构良好的 XML。需要找到一个能够理解所有形式的 PDF 字段的库。
    【解决方案3】:

    在 Java 中,有一些库可以处理 PDF,但通常很难从 PDF 中获取格式化信息。我从来没有实现过那个东西,但是 Qoppa 看起来不错,而且似乎很先进,但它不是免费的。它包含jPDFFields,这对于从表单字段中提取值应该很有用。 还有一个similar thread,里面有一些命令行工具的信息。

    希望对你有帮助。

    【讨论】:

    • 感谢您抽出宝贵时间。实际上,我一直在寻找开源库或工具。对不起,我还没有提到它。 jPDFFields 可以完成这项工作。我尝试了演示小程序并且它可以工作,因为我可以将它导出为 XML (XFDF)。但是,它不是开源的:-/
    【解决方案4】:

    我使用pdfminer取得了很大的成功:

    pdf2txt.py -o out.xml -t xml sample.pdf
    

    然后使用 xpath 解析它并加入字符串,以从您的代码中使用它跟踪代码here

    除此之外,街区里有一个叫tabula 的新孩子,用 ruby​​ 写的,我还没有机会使用它,但应该很棒

    我理解您不愿意使用付费服务,但仍然值得一提的是,Adobe 有一个转换服务,在撰写本文时每月收费 2 美元,check it out,只是说...

    【讨论】:

    • 你能用 pdfminer 导出表单域吗?因为我不是。我尝试使用(pdf2text 演示页面)[pdf2html.tabesugi.net:8080/] 转换我的 pdf 示例文件(如上所述)以提取表单字段,但导出仅限于静态字段。我还没有在 ruby​​ 中做过任何事情,但这可能是一个选择。我会看看这个。此外,我将在一秒钟内测试您的命令行 sn-p,以确保我之前使用它时没有做错任何事情。
    • AFAIK 在 pdfminer 上没有字段的概念,但你可以使用正确的 xpath 走得很远
    • 如果值得的话,你能提供一个小例子或链接吗?从我的角度来看,当我的输出文件(从 pdf 转换为文本)不包含任何表单字段数据时,我无法想象如何使用 xpath 来提取内容。我做对了吗?
    • 这应该转换为当前版本stackoverflow.com/questions/3984003/…
    • 我已经尝试过这个解决方案,但如果我没记错的话,我无法使用fields = resolve1(doc.catalog['AcroForm'])['Fields']。不过,我会再试一次。必须有某种方法可以导出表单字段。如果我可以将表单字段内容存储在对象中而不将其解析为 xml,我也会感到满意。我会及时通知你。
    【解决方案5】:

    对于 Java 解决方案,您可以使用 iText 读取字段,然后使用 jackson-dataformat-xml 之类的东西将结果写入 XML。 A,有点基本的例子是:

    // read fields
    final PdfReader reader = new PdfReader("/path/to/my.pdf");
    
    final AcroFields fields = reader.getAcroFields();
    final Map<String, Object> values = new HashMap<>();
    for (String fieldName : (Set<String>) fields.getFields().keySet()) {
        values.put(fieldName, fields.getField(fieldName));
    }
    
    // write
    final XmlMapper mapper = new XmlMapper();
    final String result = mapper.writeValueAsString(values);
    
    System.out.println(result);
    

    这里肯定有一些改进的余地,但它可能是一个足够好的起点。

    【讨论】:

    • iText 不是开源的,对吧?至少我没有看到开源库。如果它不是开源的,那不是一个选择,因为我只会使用该功能来提取表单字段数据。
    • 他们声称是开源的,代码可以在here找到,还有two licenses available,商业和AGPL。
    • 我将通过我们的许可证管理再次检查!它可以工作,因为该项目目前计划为内部项目。我需要等待许可专家的答复。
    猜你喜欢
    • 1970-01-01
    • 2019-12-21
    • 2015-12-20
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    相关资源
    最近更新 更多