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

Serving dynamic PDF through Flask, generated with pdfrw

我正在尝试通过 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 或可能?当我让它工作时,我将为此在 flask 中创建一个指向 /pdf 路由的按钮 href。

抱歉,我对此很陌生,正在努力满足用户的愿望。

感谢您的指导或指导。

假设您不想将 PDF 保存到服务器,而只是将其保存在内存中,然后使用 Flask 的 send_file 函数提供它,您可以将 write_fillable_pdf 函数修改为return 字节类型对象。所以而不是:

pdfrw.PdfWriter().write(output_pdf_path, template_pdf)

您可以执行以下操作:

buf = io.BytesIO()
pdfrw.PdfWriter().write(buf, template_pdf)
buf.seek(0)
return buf

记得在文件顶部import io

然后在你的flask代码中,write_fillable_pdf的return值可以直接传递给发送文件函数:

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