如何自动将PDF表单字段导出为XML

12

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

enter image description here

注意:使用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文件:但如何导出表单字段数据(在我的情况下是表单字段first_namelast_name的内容)呢?

编辑:可以从此处免费下载sample.pdf文件。

5个回答

9
如何考虑使用 Apache PDFBox?它是开源的并且能够满足您的需求,因为该网站上表示“从PDF表单中提取表单数据或填充PDF表单”。
编辑:请查看PrintFields示例

看起来很不错!我尝试通过命令行提取所有表单字段,它可以工作。明天我会继续研究Java源代码示例,但从我所看到的来看,它正是我想要的。我会保持更新! - Michael
1
很高兴它能帮上一点忙。我忘了说jdom库可能是将对象转换为xml的好方法。祝你好运! - jimmyp.smith

2
在bash中,您可以这样做(至少在我的版本中,这些工具的版本是less 444和cat 8.13):
less ~/Downloads/sample.pdf | cat

我得到的输出看起来像这样:

Static form header

First name:   John

Last name:    Doe

然后,您可以使用Java/Python/awk或其他工具轻松解析它。

当然,如果您不想依赖特定版本的这些工具(不确定它们是否总是这样做),您可以查看less的源代码来了解其如何实现。


有任何想法如何在 Windows 机器上完成它吗? - Michael
您可以尝试使用Cygwin。或者,就像我在编辑中添加的那样,查看Less本身是如何做的,并尝试将该代码移植到Windows系统。或者,您可以安装VMWare,在虚拟机上运行操作,让虚拟机完成并返回结果。或者,您可以启动EC2实例,让EC2实例执行操作并返回结果。 - James Kingsbery
谢谢您的建议。我会查看源代码,看看能否进行适应。使用虚拟机还不是一个选项。我更喜欢在独立的机器上运行的解决方案。 - Michael
我在Adobe Acrobat DC中填写了PDF的字段,但无法获取字段数据。答案提示在其中,但被二进制垃圾包围着。在Google Chrome中填写了相同的表格并打印到PDF文件中,它具有可以检索的结构化XML。需要找到一个理解所有形式的PDF字段的库。 - rob

1
在Java中,有一些库可用于处理PDF文件,但通常很难从PDF中获取格式化信息。我从未实现过这个功能,但Qoppa看起来不错,似乎比较先进,但它不是免费的。它包含jPDFFields,应该对从表单字段中提取值很有用。 此外,还有一个类似的主题,其中提供了一些关于命令行工具的信息。
希望对您有所帮助。

感谢您抽出时间。实际上,我正在寻找一个开源库或工具。很抱歉我之前没有提到这一点。jPDFFields可以胜任此工作。我尝试了演示小程序,它可以工作,因为我可以将其导出为XML(XFDF)。但是,它不是开源的 :-/ - Michael

1

我在编程中使用 pdfminer 取得了很大的成功:

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

然后使用xpath解析它并连接字符串,要在代码中使用它,请跟踪代码此处
除此之外,有一个新的工具tabula,用ruby编写,我还没有机会使用,但据说非常好。
我理解您不想使用付费服务,但仍然值得一提的是Adobe有一个转换服务,在撰写本文时每月收费2美元,请查看,只是提一下...

你能用pdfminer导出表单字段吗?因为我做不到。我尝试使用(pdf2text演示页面)[http://pdf2html.tabesugi.net:8080/]将我的pdf示例文件(如上所提供)转换为提取表单字段,但是导出仅限于静态字段。我还没有在ruby中做过任何事情,但这可能是一个选项。我会看看这个。此外,我将在第二个测试您的命令行片段,只是为了确保我以前使用它时没有做错任何事情。 - Michael
据我所知,pdfminer上没有字段的概念,但是如果使用正确的xpath,你可以做得非常好。 - Guy Gavriely
你能否提供一个小例子或链接,如果有的话?从我的角度来看,当我的输出文件(从PDF转换为文本)不包含任何表单字段数据时,我无法想象如何使用XPath来提取内容。我理解得对吗? - Michael
如何在Python中提取填写表单的PDF字段,应转换为当前版本https://dev59.com/S2865IYBdhLWcg3wHKte - Guy Gavriely
我已经尝试过这个解决方案,但如果我没记错的话,我无法使用fields = resolve1(doc.catalog['AcroForm'])['Fields']。不过,我会再试一次。一定有办法导出表单字段。如果我能将表单字段内容存储在对象中而不是解析为xml,我也会满意。我会随时更新你的。 - Michael

0

对于Java解决方案,您可以使用iText读取字段,然后使用jackson-dataformat-xml将结果写入XML。这的一个相对基础的示例如下:

// 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不是开源的,对吧?至少我没有看到开源库。如果它不是开源的,那么它就不是一个选项,因为我只会使用提取表单字段数据的功能。 - Michael
1
他们声称是开源的,代码可以在这里找到(http://sourceforge.net/projects/itext/),并且有商业和AGPL两种许可证可用。 - Jonathan
我会与我们的许可证管理部门再次确认!这可能是可行的,因为该项目目前计划作为内部项目。我需要等待许可证专家的答复。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接