嗨,我在使用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作者。