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

问题描述 投票:1回答:1

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

对不起,我对此很陌生,请尽我所能满足用户的要求。

谢谢您的指导或指导。

python pdf flask pdf-generation pdfrw
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.