12

我需要生成 100 多页的 PDF 文档。该过程需要处理大量数据,并且一次性生成需要更多时间和我可以提供的内存。

我尝试了几种不同的方法来破解我的方式:

结果不同,我让它工作了,但它很慢并且占用的内存比它应该的要多(有时会达到实例软内存限制)。目前,我在不同的任务中生成一些部分,将每个部分存储在 blobstore 中,并将这些部分与 pyPdf 合并,但它会阻塞较大的文档。

我生成的文档并没有那么复杂,主要是表格和文本,没有内部引用,没有 TOC,没有任何应该了解文档其余部分的内容。我可以使用 platypus 进行布局,不需要花哨的文档外观或 HTML2PDF 转换。

目标是在数据存储允许的范围内尽可能快地生成文档。并行页面生成会很好,但不是必需的。

我正在考虑使用blobstore 文件 api逐页生成,其中每个任务将生成一个页面,最后一个任务将完成 blobstore 文件使其可读。但我似乎无法找到如何暂停生成、将部分 PDF 存储到流,然后他们使用该流恢复生成以在不同的任务中生成下一页。

所以我的问题是:

GAE 如何生成大于几页的 PDF 文档,在任务请求之间拆分生成,然后将生成的文档存储在 blobstore 中?

如果reportlab无法进行生成拆分,那么如何最小化合并不同PDF文档的占用空间,使其符合GAE任务请求设置的限制?

更新: 非常感谢转换 API 的替代品。

2nd UPDATE Con ​​version API 正在停用,所以现在不是一个选项。

第三次更新 Pileline 或 MapReduce API 可以在这里提供帮助吗?

4

2 回答 2

1

看看新的转换 API:https ://developers.google.com/appengine/docs/python/conversion/overview

于 2012-04-22T15:32:56.303 回答
1

我建议在应用引擎上安装 wkhtmltopdf。wkhtmltopdf 是一个将 html 渲染成 pdf 的命令行工具。

创建html文件,然后使用wkhtmltopdf将它们一一转换为pdf。

在 Windows 上你可以使用(在基于 linux 的系统下它是类似的):

def create_pdf(in_html_file=None, out_pdf_file=None, quality=None):
    pathtowk = 'C:/wkhtmltopdf/bin/wkhtmltopdf.exe {0} {1} {2}'    

    if quality == 1: # super quality no compression
        args_str = '--encoding utf-8 --disable-smart-shrinking --no-pdf-compression --page-size A4 --zoom 1 -q -T 15.24mm -L 25.4mm -B 20.32mm  -R 33.02mm'
    elif quality == 2: # moderate quality some compression
        args_str = '--encoding utf-8 --disable-smart-shrinking --page-size A4 --zoom 1 -q -T 15.24mm -L 25.4mm -B 20.32mm  -R 33.02mm'
    else: # poor quality max compression
        args_str = '--encoding utf-8 --page-size A4 --zoom 1 -q -T 15.24mm -L 25.4mm -B 20.32mm  -R 33.02mm'

    os.system(pathtowk.format(args_str, in_html_file, out_pdf_file))

或者,您可以使用subprocess.call(pathtowk.format(args_str, in_html_file, out_pdf_file))执行 wkhtmltopdf (我认为这更好)。

转换过程完成后,使用 PyPdf2 将生成的 PDF 合并到单个文件中。

于 2015-05-08T07:57:23.403 回答