Flask 生成多个PDF文件如何打包下载?

问题描述

写了一个Flask app,首页显示一个表单,然后输入条件,提交后,从一个固定网站得到N个符合条件的新闻标题,然后用pdfkit的from_url将这些网页转换成PDF。现在想的是如何在内存中生成这些pdf并打包成一个文件供下载?

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

txt = './1.html'
with open(txt, 'w', encoding="utf-8") as f:
    f.write(responseRes.text)

file1 = open('1.html', 'r', encoding='utf-8')
soup = BeautifulSoup(file1, "lxml")
memory_file = BytesIO()
with zipfile.ZipFile(memory_file, 'w', zipfile.ZIP_DEFLATED) as zf:
     for i in soup.find_all('a', class_='black'):
         zf = pdfkit.from_url(['http://XXX.XXX.XXX' + i['href']], False)
     memory_file.seek(0)

     rv = send_file(zf, as_attachment=True, attachment_filename='filename.zip')
     return rv

你期待的结果是什么?实际看到的错误信息又是什么?

期待浏览器直接下载一个zip文件,然而浏览器返回的是一个0kb的zip文件,求教如何实现?

阅读 4.3k
2 个回答
@app.route('/test', methods=['GET'])
def testdownload():
    dir_path = os.path.join(r"D:\PycharmProjects\un",'upload')
    file_name = "bb.zip"
    return send_from_directory(dir_path, file_name, as_attachment=True)

这个思路是应该分为两步:
第一步是先使用 pdfkit 的 from_url 将这些网页转换成单个 PDF 文件,生成 pdf 文件的动作完成后,再用 zipfile 将所有生成的 pdf 文件打包成一个 zip 文件。
第二步是使用 @wt1187982580 提供的 send_from_directory(dir_path, file_name, as_attachment=True) 生成一个 url,然后在网页上设置一个按钮,并将超链接链接到这个 url。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题