我有一个项目需要填写预先制作好的PDF文件,我认为最合理的解决方案是将预先制作好的PDF文件转换成PDF表单,这样就可以在表单标签中输入值,然后我可以浏览PDF表单中的标签,并将它们与值的字典进行匹配。
我已经使用了PyPDF2完成了这个任务。总体上,我拍摄了一个Web表单图像,然后打开Acrobat并基于图像中看到的字段创建了一个PDF表单,然后使用PyPDF2来填写PDF表单字段,但问题在于,在某些浏览器(如Firefox)中打印这些填好的值似乎存在故障。
我该如何将我的PDF表单转换为标准/平面PDF,以便保留预填的值,但丢失可编辑的字段(因为我认为这是问题所在)?
我已经使用了PyPDF2完成了这个任务。总体上,我拍摄了一个Web表单图像,然后打开Acrobat并基于图像中看到的字段创建了一个PDF表单,然后使用PyPDF2来填写PDF表单字段,但问题在于,在某些浏览器(如Firefox)中打印这些填好的值似乎存在故障。
我该如何将我的PDF表单转换为标准/平面PDF,以便保留预填的值,但丢失可编辑的字段(因为我认为这是问题所在)?
from io import BytesIO
import PyPDF2
from django.http import HttpResponse
from PyPDF2.generic import BooleanObject, NameObject, IndirectObject
def pdf_view(request):
template = 'templates/template.pdf'
outfile = "templates/test.pdf"
input_stream = open(template, "rb")
pdf_reader = PyPDF2.PdfFileReader(input_stream, strict=False)
if "/AcroForm" in pdf_reader.trailer["/Root"]:
pdf_reader.trailer["/Root"]["/AcroForm"].update(
{NameObject("/NeedAppearances"): BooleanObject(True)})
pdf_writer = PyPDF2.PdfFileWriter()
set_need_appearances_writer(pdf_writer)
if "/AcroForm" in pdf_writer._root_object:
# Acro form is form field, set needs appearances to fix printing issues
pdf_writer._root_object["/AcroForm"].update(
{NameObject("/NeedAppearances"): BooleanObject(True)})
data_dict = {
'first_name': 'John',
'last_name': 'Smith',
'email': 'mail@mail.com',
'phone': '889-998-9967',
'company': 'Amazing Inc.',
'job_title': 'Dev',
'street': '123 Main Way',
'city': 'Johannesburg',
'state': 'New Mexico',
'zip': 96705,
'country': 'USA',
'topic': 'Who cares...'
}
pdf_writer.addPage(pdf_reader.getPage(0))
pdf_writer.updatePageFormFieldValues(pdf_writer.getPage(0), data_dict)
output_stream = BytesIO()
pdf_writer.write(output_stream)
# print(fill_in_pdf(template, data_dict).getvalue())
# fill_in_pdf(template, data_dict).getvalue()
response = HttpResponse(output_stream.getvalue(), content_type='application/pdf')
response['Content-Disposition'] = 'inline; filename="completed.pdf"'
input_stream.close()
return response
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)
except Exception as e:
print('set_need_appearances_writer() catch : ', repr(e))
return writer