pdfrw-使用python填充pdf,在多页使用slice时遇到问题
嗨,我在使用pdfrw for python时遇到问题。我试图用pdfrw填充PDF,我可以填充一页。obj.pages只接受整数,不接受切片。目前,它将只填充指定的一页。当我在obj.page中输入第二页时,它只填充第二页,以此类推。我需要填充四页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
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循环的澄清,它马上就清除了。我很难把它分解成循环。