使用Python(PyPDF2)填充PDF表单时无法选中复选框的问题求助
我在尝试自动填充以下PDF表单:Temporal.pdf,该文件可通过ilovepdf解密后操作。
目前我填充文本字段没有任何问题,但始终无法操作复选框字段:大量/Btn类型字段带有/Kids属性,这些子项均为IndirectObject类型的复选框对象;同时部分无/Kids属性的普通复选框我也无法选中/修改,相关示例如下。
实现代码
from PyPDF2 import PdfFileReader, PdfFileWriter from PyPDF2.generic import BooleanObject, NameObject, IndirectObject from collections import OrderedDict def set_need_appearances_writer(writer: PdfFileWriter): # 相关规则参考PDF规范12.7.2、7.7.2章节 try: catalog = writer._root_object # 获取AcroForm树节点 if "/AcroForm" not in catalog: writer._root_object.update({ NameObject("/AcroForm"): IndirectObject(len(writer._objects), 0, writer) }) need_appearances = NameObject("/NeedAppearances") writer._root_object["/AcroForm"][need_appearances] = BooleanObject(True) return writer except Exception as e: print('set_need_appearances_writer() 捕获异常: ', repr(e)) return writer reader = PdfFileReader("TEMPORAL COMPLETO12 de mayo_unlocked.pdf") writer = PdfFileWriter() set_need_appearances_writer(writer) page = reader.pages[0] writer.addPage(page) # Texto4字段填充正常,复选框填充无效 writer.updatePageFormFieldValues( writer.getPage(0), {'BOTON_TIPOJORNADA': '/1', 'BOTON_JORN': '/S', 'Texto4': 'Texto4' } ) with open("filled-out.pdf", "wb") as output_stream: writer.write(output_stream) reader.stream.close()
我手动修改PDF复选框状态后读取字段,结果如下:
reader.getFields() # 选中其中一个复选框时的输出 [...] 'BOTON_JORN': {'/FT': '/Btn', '/Kids': [IndirectObject(160, 0), IndirectObject(162, 0), IndirectObject(167, 0), IndirectObject(172, 0)], '/T': 'BOTON_JORN', '/Ff': 49152, '/V': '/S'}, # 选中另一个复选框时的输出 [...] 'BOTON_JORN': {'/FT': '/Btn', '/Kids': [IndirectObject(160, 0), IndirectObject(162, 0), IndirectObject(167, 0), IndirectObject(172, 0)], '/T': 'BOTON_JORN', '/Ff': 49152, '/V': '/D'},
另有一个无/Kids属性的普通复选框TEXTOCasilla de verificación25也无法选中/修改,该复选框选中时/V值为/S#ED,字段属性如下:
'TEXTOCasilla de verificación25': {'/FT': '/Btn', '/T': 'TEXTOCasilla de verificación25', '/V': '/S#ED'},
希望能得到相关解决方案建议。
内容的提问来源于stack exchange,提问作者Luisón
相关产品推荐
相关产品推荐

