Как сказано в заголовке, я пытаюсь заполнить некоторые поля 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 может быть решена, было бы хорошо. Любая помощь приветствуется.
С уважением