解决方案非常简单,有疑问时请阅读文档( 第552/978页 ):
https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/pdf_reference_archives/PDFReference.pdf
我要做的就是将字段标志的位位置更改为1,使字段变为ReadOnly,如下所示:
from io import BytesIOimport PyPDF2from django.http import HttpResponsefrom PyPDF2.generic import BooleanObject, NameObject, IndirectObject, NumberObjectdef pdf(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': 'Johnn', 'last_name': 'Smithn', 'email': 'mail@mail.comn', 'phone': '889-998-9967n', 'company': 'Amazing Inc.n', 'job_title': 'Devn', 'street': '123 Main Wayn', 'city': 'Johannesburgn', 'state': 'New Mexicon', 'zip': 96705, 'country': 'USAn', 'topic': 'Who cares...n' } pdf_writer.addPage(pdf_reader.getPage(0)) page = pdf_writer.getPage(0) pdf_writer.updatePageFormFieldValues(page, data_dict) for j in range(0, len(page['/Annots'])): writer_annot = page['/Annots'][j].getObject() for field in data_dict: # -----------------------------------------------------BOOYAH! if writer_annot.get('/T') == field: writer_annot.update({ NameObject("/Ff"): NumberObject(1) }) # ----------------------------------------------------- output_stream = BytesIO() pdf_writer.write(output_stream) response = HttpResponse(output_stream.getvalue(), content_type='application/pdf') response['Content-Disposition'] = 'inline; filename="completed.pdf"' input_stream.close() return responsedef 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


