通过 Flask 提供动态 PDF,使用 pdfrw 生成



我正在尝试通过Flask为我的用户提供动态PDF。他们填写表格以显示一些计算结果,但他们希望将值自动填充到 PDF 模板,然后将其打印在纸上。

我让它在本地工作,只是将值填充到 PDF 模板中,但我不知道如何将它工作到我的 Flask 应用程序中。我在本地得到的是我有一个模板PDF文件,一个带有值的字典,一个将值填充到模板并将其写出到新的PDF文件的函数。 当使用 Flask 托管它时,我希望它动态地为他们提供由函数创建的新 PDF,而不是将其写入文件。

我正在使用 pdfrw 库进行 pdf 修改,我意识到我可能需要使用 make_reponse 或 IO 或组合。只是不知道如何将结果从 pdfrw NOT 获取到文件。或者从哪里开始。

函数如下:


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,该可以根据用户或其他地方提供的值进行构造。

最新更新