Вопрос по заполнению форм в редактируемом PDF-файле - PullRequest
1 голос
/ 17 июня 2020

Как сказано в заголовке, я пытаюсь заполнить некоторые поля PDF с помощью сценария Python, вот что я для этого использовал:

[Свойства моей рабочей среды]

0 - Операционная система: Windows 7 32-бит

1 - Python версия 3.8.3 .

2 - Редактируемый файл PDF, вы можете получить его здесь Editable_PDF.pdf

3 - Используется pdfrw библиотека для чтения и записи файла PDF.

4 - Имена полей и значения из внешнего файла конфигурации я назвал Field_Value.ini здесь это содержимое

R's #=R: 1111
C's #=C: 2222
R's Address=3333
C's Address=4444
Date Filed=5555
Docket #=6666

Как вы видите, первый столбец перед = - это некоторые из имен полей этого PDF-файла, а второй - значения, которые необходимо заполнить.

Я получил их с помощью pdfforms утилиты с этой командной строкой

pdfforms inspect Editable_PDF.pdf

Будет создан файл . json (с именем fields. json), содержащий информацию о каждом поле, найденном в этом PDF-файле.

5 - A Python скрипт для прочтите этот файл .ini и заполните поля Editable_PDF.pdf .

На самом деле я добился успеха в большей части этого, кроме одной мелочи, которая заставила меня задать вопрос об этом, потому что, честно говоря, я не нашел для него решения и все еще ищу.

Дело в том, что все поля, перечисленные в Field_Value.ini , заполнены, кроме этого Docket # , независимо от того, что я делаю, это просто не заполняется, самое забавное, что если вы попытаетесь заполнить его вручную через браузер или редактор PDF, он заполнится. Вначале я подумал, что могу указать неправильное имя поля, но нет, я думаю, что это правильно, потому что какое бы значение я ни вводил, я нашел его удобное имя в полях . json то же самое Docket # .

Итак, вопрос, что, черт возьми, не так с этим полем Docket # ???, да серьезно, есть кое-что, чего я не понимаю, и я чувствую, что это как-то просто .

Я не хочу, чтобы вы писали для этого сценарий, я уже сделал его, по крайней мере, для тестирования. Все, что вам нужно, это установить библиотеку pdfrw с Python, и это сценарий:

import pdfrw

PDF_PATH = 'Editable_PDF.pdf'

ANNOT_KEY = '/Annots'
ANNOT_FIELD_KEY = '/T'
ANNOT_VAL_KEY = '/V'
ANNOT_RECT_KEY = '/Rect'
SUBTYPE_KEY = '/Subtype'
WIDGET_SUBTYPE_KEY = '/Widget'

def write_fillable_pdf(input_pdf_path, output_pdf_path, data_dict):
    template_pdf = pdfrw.PdfReader(input_pdf_path)
    annotations = template_pdf.pages[0][ANNOT_KEY]
    for annotation in annotations:
        if annotation[SUBTYPE_KEY] == WIDGET_SUBTYPE_KEY:
            if annotation[ANNOT_FIELD_KEY]:
                key = annotation[ANNOT_FIELD_KEY][1:-1]
                if key in data_dict.keys():
                    annotation.update(
                        pdfrw.PdfDict(V='{}'.format(data_dict[key]))
                    )
    pdfrw.PdfWriter().write(output_pdf_path, template_pdf)

with open("Field_Value.ini", 'r') as file:
    data = file.read()
Array = data.split('\n')
for i in range (0, len(Array)): 
    Field_Value = Array[i].split('=')
    Field = Field_Value[0]
    Value = Field_Value[1]
    print (Field , ' = ' , Value)
    if __name__ == '__main__':
        data_dict = {
            Field: Value
        }
        write_fillable_pdf(PDF_PATH, PDF_PATH, data_dict)
    
pdf_template = pdfrw.PdfReader(PDF_PATH)
pdf_template.Root.AcroForm.update(pdfrw.PdfDict(NeedAppearances=pdfrw.PdfObject('true')))
pdfrw.PdfWriter().write(PDF_PATH, pdf_template)

Это может быть немного некрасиво, но он делает то, что Я нуждаюсь. Я думал, что вы, ребята, имеете представление об этом, поэтому любая помощь приветствуется, и спасибо даже за то, что вы потратили время, чтобы просто прочитать это.

EDIT:

Похоже, pdfrw каким-то образом не обнаруживает это имя поля.

Я сказал, что пытался распечатать обнаруженные поля, пока pdfrw обрабатывал PDF-файл, как это print (key) или print (annotation[ANNOT_FIELD_KEY][1:-1]) , в нем перечислены почти все имена полей, кроме того, которое я ищу Docked # , поэтому я думаю, что именно поэтому он не заполняет эту форму.

В любом случае я решил это, используя Другим способом я обнаружил, что pdftk может сделать это через простую командную строку, используя файл .fdf , содержащий .ini , так что да, на данный момент он решил это Кстати.

Если вы думаете, что проблема с pdfrw может быть решена, было бы хорошо. Любая помощь приветствуется.

С уважением

...