Java 如何将pdf表单字段自动导出为xml

Java 如何将pdf表单字段自动导出为xml,java,xml,python-2.7,acrobat,pdf-extraction,Java,Xml,Python 2.7,Acrobat,Pdf Extraction,我有一个包含表单字段的pdf文件,需要将数据自动导出到xml文件中。下面是我为测试创建的示例表单的屏幕: 注意:使用Acrobat Professional手动导出它非常有效,方法是单击Tools>Form>Export Form Data,最后选择xml扩展名作为文件输出。这是手动导出时得到的结果: <?xml version="1.0" encoding="UTF-8"?> <fields> <first_name>John</first_

我有一个包含表单字段的
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文件的静态部分(如
静态表单头
名字:
姓氏:
),但是如何导出表单字段数据(在我的例子中,表单字段的内容是
名字
姓氏


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

在Java中,有一些库可以使用pdf,但通常很难从pdf中获取格式化信息。我从来没有实现过那个东西,但Qoppa看起来不错,似乎很先进,但它不是免费的。它包含从表单字段中提取值时应该有用的内容。 还有一个,其中有一些关于命令行工具的信息

我希望它能对您有所帮助。

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

我得到的输出如下所示:

Static form header

First name:   John

Last name:    Doe
很明显,您可以使用Java/Python/awk/whatever解析它

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

我在以下方面取得了很大成功:

然后使用xpath和连接字符串对其进行解析,以便从代码跟踪代码

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


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

对于Java解决方案,您可以使用读取字段,然后将结果写入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);
//读取字段
最终PdfReader阅读器=新PdfReader(“/path/to/my.pdf”);
final AcroFields=reader.getAcroFields();
最终映射值=新HashMap();
for(String fieldName:(Set)fields.getFields().keySet()){
value.put(fieldName,fields.getField(fieldName));
}
//写
最终XmlMapper映射器=新的XmlMapper();
最终字符串结果=mapper.writeValueAsString(值);
系统输出打印项次(结果);
这里肯定有一些改进的空间,但这可能是一个足够好的起点。

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


编辑:查看。

感谢您抽出时间。实际上,我正在寻找一个开源库或工具。对不起,我还没有提到。jpdfields将完成这项工作。我尝试了这个演示小程序,它可以工作,因为我可以将它导出为XML(XFDF)。但是,它不是开源的:-/你知道我在Windows机器上怎么做吗?你可以试试cygwin。或者,正如我在编辑中添加的那样,您可以查看less本身的功能,并尝试将代码移植到Windows。或者,您可以安装VMWare,启动虚拟机,让虚拟机执行此操作,然后返回结果。或者你可以启动一个EC2实例,让EC2实例执行,然后返回结果。谢谢你的想法。我将检查源代码,看看是否可以修改它。使用虚拟机还不是一种选择。我更喜欢在独立机器上运行的解决方案。我在AdobeAcrobatDC中填写了PDF的字段,但无法获取字段数据。答案就在那里,但是被二进制垃圾包围着。在GoogleChrome中填写相同的表单并打印成PDF文件,它具有可以检索的结构良好的XML。需要找到一个能理解所有PDF格式字段的库。你能用pdfminer导出格式字段吗?因为我不是。我尝试使用(pdf2text演示页面)转换我的pdf示例文件(如上所述)[要提取表单字段,但导出仅限于静态字段。我还没有在ruby中做任何事情,但这可能是一个选项。我将对此进行研究。此外,我将在一秒钟内测试您的命令行代码段,以确保我以前使用它时没有做错。好吧,pdfminer上没有字段的概念,但是使用正确的xpath,您可以走得更远。如果值得的话,您可以提供一个小示例或链接吗?在我看来,我无法想象在输出文件(从pdf转换为文本)时如何使用xpath提取内容不包含任何表单字段数据。我做对了吗?这应该转换为当前版本我已经尝试了此解决方案,但如果我记得正确,我无法使用
fields=resolve1(doc.catalog['AcroForm'])['fields']
。但是,我会再试一次。必须有某种方法导出表单字段。如果我可以将表单字段内容存储在对象中而不将其解析为xml,我也会感到满意。我会让您不断更新。iText不是开源的,对吧?至少我没有看到开源库。如果它不是开源的,它就不是一个选项,因为我我们只能使用该功能提取表单字段数据
pdf2txt.py -o out.xml -t xml sample.pdf
// 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);