2

我正在尝试通过 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。

对不起,我对此很陌生,试图满足我的用户的愿望。

感谢您的任何指导或指导。

4

1 回答 1

1

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

于 2020-01-26T12:59:15.770 回答