pdfrw - заполнить pdf Python, проблемы с использованием слайса для нескольких страниц - PullRequest
0 голосов
/ 05 марта 2019

Привет, у меня проблемы с использованием pdfrw для python.Я пытаюсь заполнить PDF с pdfrw, и я могу заполнить одну страницу.Объект obj.pages будет принимать только целое число, а не фрагмент.В настоящее время он заполнит только одну указанную страницу.Когда я захожу на страницу два в obj.page, она заполняет только вторую страницу и т. Д. Мне нужно заполнить четыре страницы.

import pdfrw

TEMPLATE_PATH = 'temppath.pdf'
OUTPUT_PATH = 'outpath.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[:3][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)

data_dict = {}

if __name__ == '__main__':
write_fillable_pdf(TEMPLATE_PATH, OUTPUT_PATH, data_dict)

, когда я использую срез

annotations = template_pdf.pages[:3][ANNOT_KEY]

возвращает ошибку

TypeError: list indices must be integers or slices, not str

в противном случае он будет работать только на одной странице

annotations = template_pdf.pages[0][ANNOT_KEY]

или

annotations = template_pdf.pages[1][ANNOT_KEY]

будет запускать указанную страницу

Яс похожей проблемой: Как добавить текст на вторую страницу в pdf с помощью Python, Reportlab и pdfrw?

из этой статьи https://bostata.com/post/how_to_populate_fillable_pdfs_with_python/

1 Ответ

0 голосов
/ 06 марта 2019

Исключение, которое вы видите в выражении pages[:3][ANNOT_KEY], не возникает из-за проблемы с взятием slice pages[:3] - это прекрасно работает.Но часть списка - это список, и синтаксис [ANNOT_KEY] пытается проиндексировать этот новый список, используя ANNOT_KEY, который является строкой.

Но не верьте мне на слово;разбейте строку:

    annotations = template_pdf.pages[:3][ANNOT_KEY]

на две строки:

    foobar = template_pdf.pages[:3]
    annotations = foobar[ANNOT_KEY]

и посмотрите, где произошла ошибка.

В любом случае, как я уже упоминал в комментарии выше, вытакже не следует использовать строки для индексации PdfDicts - использовать PdfStrings или просто обращаться к ним с правильными атрибутами.

Лично я не использую аннотации, поэтому я не уверен, что именно вы пытаетесь выполнить,но если аннотации всегда являются списком, если он задан, вы можете сделать что-то вроде этого:

    annotations = []
    for page in template_pdf.pages[:3]:
        annotations.extend(page.Annots or [])

(Цель выражения or [] выше - обработать случай, когда страница не имеет / Annots -- поскольку pdfrw вернет None для несуществующих ключей dict (чтобы соответствовать семантическому поведению словарей PDF), вы хотите убедиться, что вы не пытаетесь расширить список с помощью None.)

Youможет также потребоваться дедупликация списка, если на нескольких страницах есть возможность поделиться какой-либо аннотацией.

Отказ от ответственности: я являюсь основным автором pdfrw.

...