首页 > 系统相关 >odoo 下载大量pdf使用内存太大,异常退出,pdf 分页

odoo 下载大量pdf使用内存太大,异常退出,pdf 分页

时间:2023-11-01 11:37:36浏览次数:34  
标签:name docids 内存 context odoo report pdf data

说白了,还是因为wkhtmltopdf工具使用的内存太大,打印200个页面就会直接内存超标,直接退出

直接改源码了,每次让pdf 转换工具只处理50个记录

@http.route(['/report/download'], type='http', auth="user")
    def report_download(self, data, token):
        """This function is used by 'action_manager_report.js' in order to trigger the download of
        a pdf/controller report.

        :param data: a javascript array JSON.stringified containg report internal url ([0]) and
        type [1]
        :returns: Response with a filetoken cookie and an attachment header
        """
        requestcontent = json.loads(data)
        url, type = requestcontent[0], requestcontent[1]
        try:
            if type in ['qweb-pdf', 'qweb-text']:
                converter = 'pdf' if type == 'qweb-pdf' else 'text'
                extension = 'pdf' if type == 'qweb-pdf' else 'txt'

                pattern = '/report/pdf/' if type == 'qweb-pdf' else '/report/text/'
                reportname = url.split(pattern)[1].split('?')[0]

                docids = None
                if '/' in reportname:
                    reportname, docids = reportname.split('/')

                if docids:
                    # Generic report:
                    data = url_decode(url.split('?')[1]).items()  # decoding the args represented in JSON
                    response = self.report_routes(reportname, docids=docids, converter=converter, **dict(data))
                else:
                    # Particular report:
                    data = url_decode(url.split('?')[1]).items()  # decoding the args represented in JSON
                    response = self.report_routes(reportname, converter=converter, **dict(data))
                report_context = dict(url_decode(url.split('?')[1]).items())
                report = request.env['ir.actions.report']._get_report_from_name(reportname)
                filename = "%s.%s" % (report.name, extension)
                report_name = report.name
                if docids:
                    ids = [int(x) for x in docids.split(",")]
                    obj = request.env[report.model].browse(ids)
                    if report.print_report_name and not len(obj) > 1:
                        report_name = safe_eval(report.print_report_name, {'object': obj, 'time': time})
                        filename = "%s.%s" % (report_name, extension)
                response.headers.add('Content-Disposition', content_disposition(filename))
                response.set_cookie('fileToken', token)
                if report_context.get('backend'):
                    # 如果选择了后台运行,则保存到附件中,并返回None
                    self.save_attachment(response.data, report_name, filename)
                    return None

                return response
            else:
                return
        except Exception as e:
            se = _serialize_exception(e)
            error = {
                'code': 200,
                'message': "Odoo Server Error",
                'data': se
            }
            return request.make_response(html_escape(json.dumps(error)))
    @http.route([
        '/report/<converter>/<reportname>',
        '/report/<converter>/<reportname>/<docids>',
    ], type='http', auth='user', website=True)
    def report_routes(self, reportname, docids=None, converter=None, **data):
        report = request.env['ir.actions.report']._get_report_from_name(reportname)
        context = dict(request.env.context)

        if docids:
            docids = [int(i) for i in docids.split(',')]
        if data.get('options'):
            data.update(json.loads(data.pop('options')))
        if data.get('context'):
            # Ignore 'lang' here, because the context in data is the one from the webclient *but* if
            # the user explicitely wants to change the lang, this mechanism overwrites it.
            data['context'] = json.loads(data['context'])
            if data['context'].get('lang'):
                del data['context']['lang']
            context.update(data['context'])
        if converter == 'html':
            html = report.with_context(context).render_qweb_html(docids, data=data)[0]
            return request.make_response(html)
        elif converter == 'pdf':
            list_pdf_temp= []

            for list_docid in self.generator_five(docids, 50):
                pdf_temp = report.with_context(context).render_qweb_pdf(list_docid, data=data)[0]
                list_pdf_temp.append(pdf_temp)

            data_pdf = pdf_tool.merge_pdf(list_pdf_temp)
            pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(data_pdf))]
            return request.make_response(data_pdf, headers=pdfhttpheaders)
        elif converter == 'text':
            text = report.with_context(context).render_qweb_text(docids, data=data)[0]
            texthttpheaders = [('Content-Type', 'text/plain'), ('Content-Length', len(text))]
            return request.make_response(text, headers=texthttpheaders)
        else:
            raise werkzeug.exceptions.HTTPException(description='Converter %s not implemented.' % converter)

    def save_attachment(self, datas,report_name, file_name):
        """
        <record id="documents_vendor_bill_extract_azure_interior" model="ir.attachment">
            <field name="name">Invoice Azure Interior</field>
            <field name="datas_fname">invoice_azure_interior.pdf</field>
            <field name="datas" type="base64" file="documents/demo/files/invoice_azure_interior.pdf"/>
            <field name="folder_id" ref="documents_finance_folder"/>
        </record>
        """
        attach = request.env['ir.attachment']
        var = dict(name=report_name,
                   datas_fname=file_name,
                   datas=base64.b64encode(datas).decode('utf-8'),
                   folder_id=request.env.ref('documents.documents_finance_folder').id
                   )
        attach.create([var])

    @staticmethod
    def generator_five(parm, num):
        """
        将列表切分成每5个来返回
        :param parm:
        :return:
        """
        length = len(parm)

        for i in range(0, length, num):
            yield parm[i:i + num]

懂得,原来世界如此简单!



标签:name,docids,内存,context,odoo,report,pdf,data
From: https://blog.51cto.com/qianxunman/8120177

相关文章

  • odoo pdf 打印任务后台运行,pdf保存在附件中, 借助queue_job模块实现后台打印
    用户故事:在打印大批量pdf文件时会有较长事件的等待,而且容易中断原因中断原因,有内存及超时限制,wkhtmltopdf工具比较吃内存解决方案:内存限制的问题可以分批处理,比如每次只处理50条记录代码示例,使用按钮触发的打印功能:#model:res.partner@api.modeldefsave......
  • 【专题】2021 年中国电力行业经济运行报告PDF合集分享(附原数据表)
    报告合集根据实践创新,我们提出了“云上新型电力系统”,该系统将加速电力流、信息流和价值流的融通流动,通过更灵活高效的能源资源优化配置平台,支持大规模的新能源开发和利用。这一系统将为电力业务创新、电力行业发展以及全社会的绿色生产和生活提供坚实保障,并创造无限的可能性。电......
  • 【专题】2022年中国财税数字化行业研究报告PDF合集分享(附原数据表)
    数字化是复杂系统中的一个重要驱动因素,它得到了技术进步的支持。随着以大数据、物联网、云计算、人工智能等为代表的数字技术的不断成长和成熟,企业必须应对的内外部环境发生了翻天覆地的变化。新的全球生产力革命的一个关键驱动因素是数字智能化。企业的采购、生产、经营、销售等商......
  • 【专题】中国小微企业云财税行业研究报告PDF合集分享(附原数据表)
    数字化是复杂系统中的一个重要驱动因素,它得到了技术进步的支持。随着以大数据、物联网、云计算、人工智能等为代表的数字技术的不断成长和成熟,企业必须应对的内外部环境发生了翻天覆地的变化。新的全球生产力革命的一个关键驱动因素是数字智能化。企业的采购、生产、经营、销售等商......
  • 【2023-11-01】一款基于 pdf.js 的 PDF 批注注释插件库(纯JS、高亮、画笔、多边形、历
    基于纯JavaScript和PDF.js做的一款PDF批注拓展插件-PDFMaster,一款仍能兼容支持IE11的PDF批注插件,界面美观功能强大,有无开发经验都可以快速简单快速使用。Demo及源码Demo和源码地址:https://demos.libertynlp.com功能演示视频:https://www.bilibili.com/video/BV12C4y1n7TL......
  • 解决ES因内存不足而无法查询的错误,Data too large, data for [<http_request>]
    转自https://www.kancloud.cn/luke8327/phpwolf/2655264本解决方案的前提是在docker环境下错误详情:[type=circuit_breaking_exception,reason=[parent]Datatoolarge,datafor[<http_request>]wouldbe[125643918/119.8mb],whichislargerthanthelimitof[9083......
  • 【专题】2023年中国新消费潜力洞察蓝皮书报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34074近年来,随着中国消费升级的趋势,新兴消费品牌在市场上逐渐崭露头角。这些品牌以挑战者的身份进入市场,通过创新的供应链、产品和营销策略,以用户为核心满足新的消费需求,实现了短期内的强劲增长和销售规模的快速扩张。然而,经济环境、疫情冲击和激烈......
  • 【专题】2023文化娱乐新消费报告报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34074近年来,随着中国消费升级的趋势,新兴消费品牌在市场上逐渐崭露头角。这些品牌以挑战者的身份进入市场,通过创新的供应链、产品和营销策略,以用户为核心满足新的消费需求,实现了短期内的强劲增长和销售规模的快速扩张。然而,经济环境、疫情冲击和激烈......
  • 【专题】新消费看长沙:中国经济转型样本报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34074近年来,随着中国消费升级的趋势,新兴消费品牌在市场上逐渐崭露头角。这些品牌以挑战者的身份进入市场,通过创新的供应链、产品和营销策略,以用户为核心满足新的消费需求,实现了短期内的强劲增长和销售规模的快速扩张。然而,经济环境、疫情冲击和激烈......
  • 【专题】2022新消费增长洞察报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34074近年来,随着中国消费升级的趋势,新兴消费品牌在市场上逐渐崭露头角。这些品牌以挑战者的身份进入市场,通过创新的供应链、产品和营销策略,以用户为核心满足新的消费需求,实现了短期内的强劲增长和销售规模的快速扩张。然而,经济环境、疫情冲击和激烈......