我按照有关如何使用 PyPDF2 的指南进行操作,并且文本字段已填充。唯一的问题是,我在文本字段上看到蓝色覆盖层,并且仅当我单击蓝色覆盖层时才会显示其下方写的文本,请看这张图片:
如果用户在该字段中键入,则显示“全名”字段。如果我单击蓝色覆盖层以显示 PyPDF2 写入的文本,则“全名”字段是完整的名字字段,而“全名”字段是如果我不单击该字段,则 PyPDF2 写入文本字段的外观。无论如何,是否可以使用 PyPDF2 或相关库让中间和右侧的文本字段看起来像左侧的文本字段?
我的代码如下:
#!/usr/bin/python3
filename = "file.pdf"
from PyPDF2 import PdfReader, PdfWriter
from PyPDF2.generic import BooleanObject, NameObject, IndirectObject
def set_need_appearances_writer(writer):
try:
catalog = writer._root_object
# get the AcroForm tree and add "/NeedAppearances attribute
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() catch : ", repr(e))
return writer
reader = PdfReader(filename, "rb")
if "/AcroForm" in reader.trailer["/Root"]:
reader.trailer["/Root"]["/AcroForm"].update(
{NameObject("/NeedAppearances"): BooleanObject(True)}
)
blankTextFields = reader.get_form_text_fields()
blankTextFieldsKeys = blankTextFields.keys()
pdfFillerDict = {}
for key in blankTextFieldsKeys:
if "BarCode" not in key:
value = input("What is your " + key[:-3] + "? ")
pdfFillerDict.update({key: value})
writer = PdfWriter()
set_need_appearances_writer(writer)
if "/AcroForm" in writer._root_object:
writer._root_object["/AcroForm"].update(
{NameObject("/NeedAppearances"): BooleanObject(True)}
)
writer.add_page(reader.pages[0])
print(blankTextFields)
print(pdfFillerDict)
writer.update_page_form_field_values(
writer.pages[0], pdfFillerDict
)
with open("filled-out.pdf", "wb") as output_stream:
writer.write(output_stream)
output_stream.close()
蓝色是读者字段的默认颜色,否则你怎么知道透明背景上的内容是什么?
显然这是一个不好的样本,但蓝色是真实的。包括字段的注释位于最顶层,因此如果数据不在字段内,则不会出现。因此,在您的情况下,文本可能位于正文中,因此被字段掩盖。这里,使用非 FDF 方法严重填充了字段(您可以看到 FDF 条目嵌入在数据中),因此文件行为不当。
稍后编辑
OP 正在尝试填写 XFA 脚本表单封面中的字段,该表单在用户填写时需要运行 JavaScript。应不惜一切代价避免这些奇异的 XML 模板,因为它们仅设计为由个人填写,作为个人承诺(例如转让或财务协议)的一部分,因此无法得到机器的同意。此类文件通常有一个封面,明确说明它们只能在 Acrobat Reader 或更好的版本中使用。
这些表单使用不同的方法,最好通过 CSV 导入完成,例如本例中此列到字段的映射
对我来说,我只是得到了预期的失败,因为我测试的数据结构无法以这种方式工作,并且 Adobe 开发人员支持表示使用 Neutered XFA 导出为真正的 PDF 来启用 PDF AcroForms 填充。
当由个人填写时,脚本将重写条形码并验证数据提交,以附加到个性化提交的其他部分。