python中html表单域的处理,Python Django PDF格式化表单域

解决方案非常简单,有疑问时请阅读文档(第552/978页):

https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/pdf_reference_archives/PDFReference.pdf

我需要做的就是将字段标志的位位置更改为1,使字段ReadOnly,如下所示:

from io import BytesIO

import PyPDF2

from django.http import HttpResponse

from PyPDF2.generic import BooleanObject, NameObject, IndirectObject, NumberObject

def 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': 'John\n',

'last_name': 'Smith\n',

'email': 'mail@mail.com\n',

'phone': '889-998-9967\n',

'company': 'Amazing Inc.\n',

'job_title': 'Dev\n',

'street': '123 Main Way\n',

'city': 'Johannesburg\n',

'state': 'New Mexico\n',

'zip': 96705,

'country': 'USA\n',

'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 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值