2017-10-12 39 views
1

我有一个可填写的pdf,其中需要由用户填写的字段。我试图用python自动生成对这些字段的响应,但我需要知道表单字段的宽度/长度,以便知道我的响应是否适合该字段。在Python中查找pdf表单字段的宽度

如何找到这些字段的宽度,或至少测试一个可能的响应是否合适?

我在想,如果我知道字段的字体和字体大小,那可能会有所帮助。

编辑:我刚刚意识到PDF是加密的,所以用编程方式与PDF接口可能是不可能的。尽管对于快速和肮脏的解决方案提出任何建议都是受欢

链接形式:http://static.e-publishing.af.mil/production/1/af_a1/form/af910/af910.pdf

我需要知道的评论块的宽度。

+0

你能展示什么形式的样子?你也使用PyPDF? – Worm

+0

用户需要填写多少个字段? – Worm

+0

有4个领域需要填写,但他们都是相同的宽度,所以我只需要一个长度。我没有使用PyPDF,但我不需要脚本直接输入到PDF。我只需要一个可以复制和粘贴的字符串。 – SlicedBadge

回答

0

一些快速挖掘各地的PDF文件和one of Adobe's pdf referencessource)事实证明,一个文本字段可以有一个关键的“MAXLEN”,其值是表示字段的文本的最大长度的整数,在字符(见页后444在提到的参考文献中)。看来如果没有这样的密钥存在,没有最大长度。

那么可以做什么,只需搜索PDF文件中的“MaxLen”键(如果多个文本字段,否则您可以只搜索一个)并返回它们的值。例如:

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文件,然后用一些可以正确读取它们的查看器,然后测量文本字段的宽度。但是,这会相当缓慢,我不确定如何去识别文本字段。

这不会帮助表单不使用等宽字体,但这是一个小问题,肯定可以解决(查找文本字段使用哪种字体,查找该字体中所有字符的宽度并在计算中使用该信息)。

如果您确实设法解决问题,请分享。 :)

+0

字段限制不是字符。在查看你链接的ref的444页后,我相信DoNotScroll标志被启用。这限制了字段在空间中的大小,但不是字符,所以WWW占用比iii更多的空间。 – SlicedBadge

+0

@SlicedBadge有趣的是,你可以在某处上传这些PDF文件并共享下载链接吗? – GBlomqvist

+1

这是空军的常用形式。我在问题描述中添加了一个链接。 – SlicedBadge