我有一个可填写的pdf,其中包含需要由用户填写的字段。我正在尝试使用python自动生成对这些字段的响应,但我需要知道表单字段的宽度/长度,以便知道我的响应是否适合该字段。
如何找到这些字段的宽度,或者至少测试一个可能的响应是否合适?
我在想,如果我知道字段的字体和字体大小,那可能会有所帮助。
编辑:我刚刚意识到pdf是加密的,因此以编程方式与pdf连接可能是不可能的。欢迎提出快速而肮脏的解决方案。
链接到表单:http://static.e-publishing.af.mil/production/1/af_a1/form/af910/af910.pdf
我需要知道注释块的宽度。
答案 0 :(得分:0)
经过一些快速浏览pdf文件和one of Adobe's pdf references(source)后发现文本字段可能有一个键“MaxLen”,其值是一个整数,表示字段的最大长度文字,字符(参见上述参考文献中的第444页)。似乎如果没有这样的密钥,则没有最大长度。
那么人们可以做的只是在pdf文件中搜索“MaxLen”键(如果是多个文本字段,否则你只能搜索一个)并返回它们的值。 E.g:
import re
with open('your_file.pdf', 'r', errors='ignore') as pdf_file:
content = pdf_file.read()
# Matches every substring "n" (n is an integer) with a preceding "/MaxLen "
regexp = '(?<=\/MaxLen )\d+'
max_lengths = [int(match) for match in re.findall(regexp, content)]
(如果文件很大,你可能无法一次性将其全部读入内存。如果是这种情况,逐行读取可能是一种解决方案。)
max_lengths将是所有“MaxLen”值的列表,在文件中出现之后排序(第一次出现将是第一次出现等)。
但是,根据您的需要,您可能需要进一步搜索并向我的代码添加更多条件。例如,如果文件包含多个文本字段但并非所有文本字段都具有最大长度,则您可能不知道哪个长度对应于哪个字段。此外,如果已修改并保存pdf文件(不使用“另存为”),则修改将附加到旧文件,而不是完全覆盖它。我不确定它是如何工作的,但我想它可以让你获得以前删除的字段等的最大长度,如果你不小心并检查它。
(以这种方式使用pdf对我来说是非常新的,如果我对任何事情都错了,请纠正我。我不是说没有可以为你做这个的库,也许PDFMiner可以,虽然它会可能会更先进。)
更新23-10-2017
我担心这个问题变得更加艰难。我相信你仍然应该能够通过解析pdf文件的正确部分来推断文本字段的宽度。为什么?因为Adobe的软件可以正确呈现它(至少是Adobe Acrobat Pro DC)而不需要一些密码来首先解密它。问题是我不知道如何来解析它。挖得足够深,你可能会发现或不知道。
我想你可以用图形方式解决问题,用一些可以正确读取它们的查看器打开每个pdf,然后测量文本字段的宽度。但是,这将相当缓慢,我不确定如何识别文本字段。
表单不使用等宽字体并没有帮助,但这是一个绝对可以解决的小问题(查找文本字段使用的字体,查找该字体中所有字符的宽度以及在计算中使用该信息。)
如果您确实设法解决了问题,请分享。 :)