2017-10-12 88 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