【问题标题】:Find width of pdf form field in python在python中查找pdf表单字段的宽度
【发布时间】:2018-03-25 00:47:36
【问题描述】:

我有一个可填写的 pdf,其中包含需要用户填写的字段。我正在尝试使用 python 为这些字段自动生成响应,但我需要知道表单字段的宽度/长度才能知道我的响应是否适合该字段。

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

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

编辑:我刚刚意识到 pdf 是加密的,因此以编程方式与 pdf 交互可能是不可能的。不过,欢迎任何有关快速而肮脏的解决方案的建议。

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

我需要知道 cmets 块的宽度。

【问题讨论】:

  • 你能展示一下表格的样子吗?你也在使用 PyPDF 吗?
  • 用户需要填写多少个字段?
  • 有4个字段需要填写,但是都是一样的宽度,所以我只需要一个的长度。我没有使用过PyPDF,但我不需要脚本直接输入PDF。我只需要一个可以复制和粘贴并适合该字段的字符串。
  • @SlicedBadge 所以你有一个 pdf 文件,你想找出一个字符串的最大长度,它只使用 Python 就可以放入 pdf 文件的表单字段中?
  • @GBlomqvist 是的,完全正确。

标签: python pdf


【解决方案1】:

在对 pdf 文件和one of Adobe's pdf references (source) 进行一些快速挖掘之后,事实证明一个文本字段可能有一个键“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 可以,尽管它会可能更高级。)


2017 年 10 月 23 日更新

恐怕问题变得更难了。我相信您仍然应该能够通过解析 pdf 文件的正确部分来推断文本字段的宽度。为什么?因为 Adob​​e 的软件可以正确渲染它(至少是 Adob​​e Acrobat Pro DC),而不需要一些密码来首先解密它。问题是我不知道 如何 解析它。深入挖掘,你可能会发现,也可能不会。

我想您可以以图形方式解决问题,使用可以正确阅读它们的查看器打开每个 pdf,然后测量文本字段的宽度。但是,这会相当慢,我不确定您将如何识别文本字段。

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

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

【讨论】:

  • 字段限制不是字符。在查看了您链接的参考文献的 pg 444 之后,我相信 DoNotScroll 标志已启用。这限制了字段的空间大小,但不限制字符大小,因此 WWW 占用的空间比 iii 多。
  • @SlicedBadge 很有趣,你能把其中一个 PDF 上传到某个地方并分享一个下载链接吗?
  • 这是来自空军的常见形式。我在问题描述中添加了一个链接。
  • @SlicedBadge 我没能解决问题,请参阅更新后的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2014-04-04
  • 2014-02-10
相关资源
最近更新 更多