如何从PDF表单中提取字段名称和属性?

问题描述 投票:0回答:3

我有 40 多个表单,我想确保公共字段具有相同的名称。这将极大地帮助我存储和排序条目。

除此之外,我想确保所有表格的格式一致。有没有办法我可以从 pdf 表单中提取这些数据(最好是 Excel 文件),以便我可以检查/进行更正。

我正在寻找的房产是:

  1. 字段ID
  2. 字段名称
  3. 字段类型
  4. 字体
  5. 字体大小
  6. 字体颜色
  7. 对齐
  8. 多行
  9. 日期格式
javascript acrobat pdf-form acrofields
3个回答
0
投票

表单数据文件(FDF 或扩展 XFDF)可以轻松地从 PDF 导出,并且可以从空白进行操作以导入到 PDF 以自动填充字段。在某些方面与 PDF 类似,它可以包含二进制媒体,但主要基于文本,因此易于解析。

它可能看起来像这样,所以很容易导入到其他应用程序

%FDF-1.4
%âãÏÓ
1 0 obj
<<
/FDF <<
/F (BrunnoFormExample.pdf)
/Fields [<<
/T (Address 1 Text Box)
/V (questions)
>> <<
/T (Address 2 Text Box)
/V (stackoverflow.com)
>> <<
/T (City Text Box)
/V (My Capitol @ WWW)
>> <<
/T (Country Combo Box)
/V (Austria)
>> <<
/T (Driving License Check Box)
/V /Yes
>> <<
/T (Family Name Text Box)
/V (Miranda Marques)
>> <<
/T (Favourite Colour List Box)
/V (Violet)
>> <<
/T (Gender List Box)
/V (Man)
>> <<
/T (Given Name Text Box)
/V (Brunno)
>> <<
/T (Height Formatted Field)
/V (150)
>> <<
/T (House nr Text Box)
/V (70970330)
>> <<
/T (Language 1 Check Box)
/V /Off
>> <<
/T (Language 2 Check Box)
/V /Yes
>> <<
/T (Language 3 Check Box)
/V /Off
>> <<
/T (Language 4 Check Box)
/V /Yes
>> <<
/T (Language 5 Check Box)
/V /Off
>>
<<
/T (Postcode Text Box)
/V (HTTPS2)
>>]
/ID [<5E0A553555622A0516E9877CA55217A6> <90A86CDE1915E44BE48046FECF63C769>]
/UF (BrunnoFormExample.pdf)
>>
/Type /Catalog
>>
endobj
trailer
<<
/Root 1 0 R
>>
%%EOF

然而,它只是字段数据,因此您无法更改样式或颜色,这些是 PDF 页面数据的一部分,因此要更改页面内容,您需要具有分析和修改能力的完整编辑器/API,而不是导入导出功能。有许多具有 API 或 SDK 功能的 GUI PDF 编辑器,例如 Windows Foxit Phantom,但您需要使用您最喜欢的平台或编程语言选择,因此对于 JS,您可以使用 iText Aspose 或 Spire 等...


0
投票

我想说你绝对可以完成第 1 部分,提取字段名称。

最简单的方法是打开每个文件并使用“准备表格”工具和“导出数据”。您可以选择一个“文本文件”,这是可以在 Excel 中打开/导入的制表符分隔文本文件。对每个文件执行 40 多次以上。

在那之后,有 JavaScript,你可能可以获取表单字段,我不确定。我做了相反的事情,使用 Javascript 将数据导入到表单中,所以我猜相反的情况也是可能的。前阵子我就此写过a Gist,它展示了如何通过 UI 导出表单数据并通过 JS 将数据导入表单。它还包含 Adobe PDF SDK 的链接,用于了解 JavaScript 中可以执行的操作,并且我还提供了其他链接来帮助我了解 Acrobat 内部的 JS“环境”。

JavaScript 之后出现了非常定制的解决方案,涉及由开源和闭源供应商编写的免费和付费工具。在免费或付费方面,UniDOC 有其 UniPDF 产品。你必须知道如何读/写 Go,但它是可以完成的,甚至是你问题的第二部分,获取字段的属性。他们有一个免费套餐,让您每月可以处理 100 个文档,然后无需付费。

我制作了一个非常简单的 PDF,其中包含两个表单字段:一个日期和一个多行文本。我使用他们的分析示例,pdf_all_objects.go,来获取这两个字段的转储。发现日期格式非常简单:

.../Subtype/Widget/T(My_date_field)/Type/Annot>><</JS(AFDate_FormatEx\("mm/dd/yyyy"\);)/S/JavaScript>><</JS(AFDate_KeystrokeEx\("mm/dd/yyyy"\);)/S/JavaScript>>

查看文本字段是否是多行比较困难。没有明确的词“多行”。相反,它是与其他值进行或运算的按位值。我必须将字段保存为多行和非多行,然后比较对象流以发现细微的差异:

@@ -150,7 +150,7 @@ Decoded:
 =========================================================
  26: 27 0 *core.PdfIndirectObject
 *core.PdfObjectDictionary
-Dict("AA": Dict(), "DA": /Helv 12 Tf 0 g, "F": 4, "FT": Tx, "Ff": 4096, "MK": Dict(), "P": Ref(17 0), "Rect": [159.063000, 604.518000, 309.063000, 626.518000], "Subtype": Widget, "T": My_multiline, "Type": Annot, )
+Dict("AA": Dict(), "DA": /Helv 12 Tf 0 g, "F": 4, "FT": Tx, "Ff": 12582912, "MK": Dict(), "P": Ref(17 0), "Rect": [159.063000, 604.518000, 309.063000, 626.518000], "Subtype": Widget, "T": My_multiline, "Type": Annot, )

"Ff": 12582912
"Ff": 4096
是多行与非多行之间的区别。

/Helv 12 Tf 0
是“12 磅 Helvetica,黑色”。

所以...可行,但很难。


0
投票

在 Linux 环境中尝试此命令:

pdftk your.pdf dump_data_fields > fields.txt

© www.soinside.com 2019 - 2024. All rights reserved.