我正在尝试通过Flask向用户提供动态PDF。他们填写了表格以进行一些计算,但是他们希望将这些值自动填写到PDF模板中,然后将其打印在纸上。
我让它在本地工作,只是将值填充到PDF模板中,但是我不知道如何将其用于Flask应用程序。我在本地得到的是我有一个模板PDF文件,一个带值的字典,一个将值填充到模板并将其写到新PDF文件的函数。当您使用Flask托管它时,我希望它为他们动态提供由函数创建的新PDF,而不是将其写入文件。
我正在使用pdfrw库进行pdf修改,我意识到我可能需要使用make_reponse或IO或它们的组合。只是不知道如何从pdfrw中获取结果而不是文件。或从哪里开始。
这里是功能:
import os
import pdfrw
data_dict = #just a plain dict corresponding with the temp.pdf keys
PDF_TEMPLATE_PATH = 'temp.pdf'
PDF_OUT_PATH = 'out.pdf'
ANNOT_KEY = '/Annots'
ANNOT_FIELD_KEY = '/T'
ANNOT_VAL_KEY = '/V'
ANNOT_RECT_KEY = '/Rect'
SUBTYPE_KEY = '/Subtype'
WIDGET_SUBTYPE_KEY = '/Widget'
def write_fillable_pdf(input_pdf_path, output_pdf_path, data_dict):
template_pdf = pdfrw.PdfReader(input_pdf_path)
annotations = template_pdf.pages[0][ANNOT_KEY]
for annotation in annotations:
if annotation[SUBTYPE_KEY] == WIDGET_SUBTYPE_KEY:
if annotation[ANNOT_FIELD_KEY]:
key = annotation[ANNOT_FIELD_KEY][1:-1]
if key in data_dict.keys():
annotation.update(
pdfrw.PdfDict(V='{}'.format(data_dict[key]))
)
pdfrw.PdfWriter().write(output_pdf_path, template_pdf)
if __name__ == '__main__':
write_fillable_pdf(PDF_TEMPLATE_PATH, PDF_OUT_PATH, data_dict)
所以我想,我怎么得到这条线
pdfrw.PdfWriter().write(output_pdf_path, template_pdf)
能够与例如make_reponse还是IO或可能?当我开始工作时,我将为此在烧瓶中的/ pdf路径中创建一个按钮-href。
对不起,我对此很陌生,请尽我所能满足用户的要求。
谢谢您的指导或指导。
[假设您不想将PDF保存到服务器,而只是将其保存在内存中,然后使用Flask的send_file
函数提供它,则可以修改write_fillable_pdf
函数以代替返回字节类型的对象。因此,代替:
pdfrw.PdfWriter().write(output_pdf_path, template_pdf)
您可以执行以下操作:
buf = io.BytesIO()
pdfrw.PdfWriter().write(buf, template_pdf)
buf.seek(0)
return buf
记住文件顶部的import io
!
然后在您的烧瓶代码中,write_fillable_pdf
的返回值可以直接传递到发送文件函数:
from flask import send_file
data = write_fillable_pdf() # With some arguments
return send_file(data, mimetype='application/pdf')
您可能希望修改write_fillable_pdf
接受的参数,因为您不再希望提供output_pdf_path
。您还需要将此data_dict
传递给它,它可以根据用户或其他地方提供的值来构造。