2012-04-22 24 views
12

我需要生成一个超过100个的PDF文档。该过程需要大量的数据来处理,全在一次代花费更多的时间和记忆,我可以给。如何生成PDF文档页逐页在后台任务在App Engine上

我已经尝试了几种不同的方法来破解,虽然我的方式:

一些网页和

  • pyPdf随着不同的结果,我得到它的工作,但它是缓慢的,需要更多的内存比它应该(有时触及实例sof t内存限制)。目前,我产生不同的任务,每个存储在Blob存储区部分路段,并与pyPdf合并这些,但它扼流圈较大的文档。

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

    我们的目标是尽可能快的数据存储将允许它生成的文件。并行页面生成会很好,但不是必需的。

    我在想每页生成blobstore files api,其中每个任务都会生成一个页面,最后一个任务将最终确定blobstore文件的可读性。但我似乎无法找到如何,暂停发电,存储部分PDF格式的流,并恢复与流产生在不同的任务来生成下一个页面。

    所以我的问题是:

    如何在GAE上产生一个比一个几页的PDF文件较大,分裂任务要求之间产生,然后存储在Blob存储所得到的文档?

    如果发生分裂是不可能的ReportLab的,那么如何融合不同的PDF文档,因此将适合通过GAE的任务要求设置的限制的足迹最小化?

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

    月2日更新 转换API正在被取消,所以现在不是一种选择。

    3rd UPDATE Can Pileline或MapReduce API的帮助在这里?

  • +0

    你有分裂源数据到页面大小的块而不做实际转换的一种方式?如果是这样,您可以编写一个函数,使用replortlab生成单个页面,并使用'multiprocessing.Pool.map'在所有输入的块的列表上并行运行该页面。作为最后一步,使用pyPdf将页面合并到单个文档中。 – 2012-04-22 14:52:00

    +0

    我已经做了类似的事情,但没有取得太大的成功,对于某些文档,合并需要很长时间才能完成(必须少于10分钟)。也许我做错了,无论如何,我想要一个代码示例如何正确地做到这一点。 – 2012-04-22 15:25:57

    +1

    快速排版大文档听起来像是TeX的工作(可能使用LaTeX或conTeXt宏包)。你必须在单独的服务器上运行它。 – 2012-04-22 15:47:30

    回答

    1
    +0

    有一个60年代的限制,你有多大的文件生成?我认为在我之前的人尝试过,并没有取得好成绩。这个API非常基础:例如如何插入分页符? – 2012-04-22 20:51:43

    +0

    如果您在任务队列运行它,然后它的10分钟限制:https://developers.google.com/appengine/articles/deferred – 2012-04-22 22:20:40

    +0

    你告诉那个[穿上转换请求最大期限60](https://开头开发商。 google.com/appengine/docs/python/conversion/overview#Limits)是否被免除,如果从任务使用转换API? – 2012-04-22 22:54:25

    1

    我建议在App Engine上安装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转换为单个文件。

    相关问题