pdfrw-使用python填充pdf,在多页使用slice时遇到问题

pdfrw-使用python填充pdf,在多页使用slice时遇到问题,python,pdfrw,Python,Pdfrw,嗨,我在使用pdfrw for python时遇到问题。我试图用pdfrw填充PDF,我可以填充一页。obj.pages只接受整数,不接受切片。目前,它将只填充指定的一页。当我在obj.page中输入第二页时,它只填充第二页,以此类推。我需要填充四页 import pdfrw TEMPLATE_PATH = 'temppath.pdf' OUTPUT_PATH = 'outpath.pdf' ANNOT_KEY = '/Annots' ANNOT_FIELD_KEY = '/T' ANNOT

嗨,我在使用pdfrw for python时遇到问题。我试图用pdfrw填充PDF,我可以填充一页。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]

将运行指定的页面

我有一个类似的问题:

从这篇文章开始工作
您看到的表达式
页面[:3][ANNOT\u KEY]
的异常不会发生,因为获取切片
页面[:3]
时出现问题,这很好。但是列表的一部分是一个列表,语法
[ANNOT\u KEY]
尝试使用ANNOT\u KEY(一个字符串)索引到这个新列表中

但不要相信我的话;拆分行:

    annotations = template_pdf.pages[:3][ANNOT_KEY]
分为两行:

    foobar = template_pdf.pages[:3]
    annotations = foobar[ANNOT_KEY]
并查看错误发生的位置

无论如何,正如我在上面的评论中提到的,您也不应该使用字符串来索引PdfDicts——使用pdfstring,或者简单地使用正确的属性访问它们

我个人不使用注释,所以我不确定您想要完成什么,但如果注释总是一个列表(如果给定),您可以这样做:

    annotations = []
    for page in template_pdf.pages[:3]:
        annotations.extend(page.Annots or [])
(上面的
或[]
表达式的目的是处理页面没有/Annots的情况——因为pdfrw将为不存在的dict键返回
None
(以匹配PDF字典的语义行为),以确保您没有尝试使用
None
扩展列表)

如果有可能多个页面共享任何注释,您可能还希望删除列表中的重复数据


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

您看到的表达式
页面[:3][ANNOT_KEY]
的例外情况不会发生,因为获取切片
页面[:3]
时出现问题,这很好。但是列表的一部分是一个列表,语法
[ANNOT\u KEY]
尝试使用ANNOT\u KEY(一个字符串)索引到这个新列表中

但不要相信我的话;拆分行:

    annotations = template_pdf.pages[:3][ANNOT_KEY]
分为两行:

    foobar = template_pdf.pages[:3]
    annotations = foobar[ANNOT_KEY]
并查看错误发生的位置

无论如何,正如我在上面的评论中提到的,您也不应该使用字符串来索引PdfDicts——使用pdfstring,或者简单地使用正确的属性访问它们

我个人不使用注释,所以我不确定您想要完成什么,但如果注释总是一个列表(如果给定),您可以这样做:

    annotations = []
    for page in template_pdf.pages[:3]:
        annotations.extend(page.Annots or [])
(上面的
或[]
表达式的目的是处理页面没有/Annots的情况——因为pdfrw将为不存在的dict键返回
None
(以匹配PDF字典的语义行为),以确保您没有尝试使用
None
扩展列表)

如果有可能多个页面共享任何注释,您可能还希望删除列表中的重复数据


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

(1)您希望
页面[:3][ANNOT\u KEY]
如何工作?那对我来说毫无意义。(2) 不要将字符串用作PdfDicts的键。使用PdfString或,例如,页面[0]。注释。V@PatrickMaupin我假设,由于整数有效,并且适用于指定的页面,因此我要编辑的页面的切片可能有效。(1)您希望
页面[:3][ANNOT_KEY]
如何工作?那对我来说毫无意义。(2) 不要将字符串用作PdfDicts的键。使用PdfString或,例如,页面[0]。注释。V@PatrickMaupin我假设,由于整数有效,并且适用于指定的页面,因此我要编辑的页面的切片可能有效。关键是要从切片中生成一个列表,这就是错误的原因。感谢您对for循环的澄清,它马上就清除了。我很难将其分解为如何循环。关键是要从切片中列出一个列表,这就是错误的原因。感谢您对for循环的澄清,它马上就清除了。我很难把它分解成循环。