用Python填充PDF,使用切片在多个页面上麻烦



嗨,我在使用python的pdfrw时遇到了麻烦。我正在尝试用PDFRW填充PDF,我可以填写一页。OBJ。页面只会接受整数而不接受切片。当前,它将仅填写指定的一页。当我在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]

将运行指示的页面

我也有类似的问题:如何使用Python,ReportLab和PDFRW将文本添加到PDF的第二页上?

在本文中工作https://bostata.com/post/how_to_populate_fillable_pdfs_with_python/

您看到的表达式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 []表达式的目的是处理一个页面没有/宣言的情况 - 因为PDFRW将返回不存在的dict键的 None(匹配PDF字典的语义行为)确保您不要尝试使用None扩展列表。)

如果多个页面可以共享任何注释,您也可能要重复列表。

免责声明:我是主要PDFRW作者。

最新更新