<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【odoo】【知識點】生成pdf文件時缺少樣式的問題

      歡迎轉載,但需標注出處,謝謝!

      背景

      近期在客戶的項目中發現在自定義報表樣式的時候,存在渲染為html正常,但是在生成pdf的時候,缺少樣式的情況。

      分析

      涉及到的odoo源碼中的ir_actions_report.py文件中的代碼

      
          def _prepare_html(self, html):
              '''Divide and recreate the header/footer html by merging all found in html.
              The bodies are extracted and added to a list. Then, extract the specific_paperformat_args.
              The idea is to put all headers/footers together. Then, we will use a javascript trick
              (see minimal_layout template) to set the right header/footer during the processing of wkhtmltopdf.
              This allows the computation of multiple reports in a single call to wkhtmltopdf.
      
              :param html: The html rendered by render_qweb_html.
              :type: bodies: list of string representing each one a html body.
              :type header: string representing the html header.
              :type footer: string representing the html footer.
              :type specific_paperformat_args: dictionary of prioritized paperformat values.
              :return: bodies, header, footer, specific_paperformat_args
              '''
              IrConfig = self.env['ir.config_parameter'].sudo()
              base_url = IrConfig.get_param('report.url') or IrConfig.get_param('web.base.url')
      
              # Return empty dictionary if 'web.minimal_layout' not found.
              layout = self.env.ref('web.minimal_layout', False)
              if not layout:
                  return {}
              layout = self.env['ir.ui.view'].browse(self.env['ir.ui.view'].get_view_id('web.minimal_layout'))
      
              root = lxml.html.fromstring(html)
              match_klass = "http://div[contains(concat(' ', normalize-space(@class), ' '), ' {} ')]"
      
              header_node = etree.Element('div', id='minimal_layout_report_headers')
              footer_node = etree.Element('div', id='minimal_layout_report_footers')
              bodies = []
              res_ids = []
      
              body_parent = root.xpath('//main')[0]
              # Retrieve headers
              for node in root.xpath(match_klass.format('header')):
                  body_parent = node.getparent()
                  node.getparent().remove(node)
                  header_node.append(node)
      
              # Retrieve footers
              for node in root.xpath(match_klass.format('footer')):
                  body_parent = node.getparent()
                  node.getparent().remove(node)
                  footer_node.append(node)
      
              # Retrieve bodies
              for node in root.xpath(match_klass.format('article')):
                  layout_with_lang = layout
                  # set context language to body language
                  if node.get('data-oe-lang'):
                      layout_with_lang = layout_with_lang.with_context(lang=node.get('data-oe-lang'))
                  body = layout_with_lang._render(dict(subst=False, body=lxml.html.tostring(node), base_url=base_url))
                  bodies.append(body)
                  if node.get('data-oe-model') == self.model:
                      res_ids.append(int(node.get('data-oe-id', 0)))
                  else:
                      res_ids.append(None)
      
              if not bodies:
                  body = bytearray().join([lxml.html.tostring(c) for c in body_parent.getchildren()])
                  bodies.append(body)
      
              # Get paperformat arguments set in the root html tag. They are prioritized over
              # paperformat-record arguments.
              specific_paperformat_args = {}
              for attribute in root.items():
                  if attribute[0].startswith('data-report-'):
                      specific_paperformat_args[attribute[0]] = attribute[1]
      
              header = layout._render(dict(subst=True, body=lxml.html.tostring(header_node), base_url=base_url))
              footer = layout._render(dict(subst=True, body=lxml.html.tostring(footer_node), base_url=base_url))
      
              return bodies, res_ids, header, footer, specific_paperformat_args
      
      1. 我們可以看到在base_url = IrConfig.get_param('report.url') or IrConfig.get_param('web.base.url')中取了系統參數中的report.urlweb.base.url中的地址。
      2. body = layout_with_lang._render(dict(subst=False, body=lxml.html.tostring(node), base_url=base_url))中渲染了我們必要的樣式,若這里的url出錯,那么這里我們將缺少樣式內容。當然,若是全部都通過html原生去實現樣式,那么也是可以避免如上的問題。

      解決方案

      在系統參數添加report.url或者web.base.url的值為http://127.0.0.1:8069(填寫本機的地址)

      posted @ 2021-08-13 20:09  老韓頭的開發日常  閱讀(872)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 青青草无码免费一二三区| 婷婷五月综合丁香在线| 在线a亚洲老鸭窝天堂| 深夜av免费在线观看| 思思久99久女女精品| 欧美gv在线| 小伙无套内射老熟女精品| 久久国产成人午夜av影院| 成在人线av无码免费| 色橹橹欧美在线观看视频高清| 国产一区二区午夜福利久久| 最新国产精品中文字幕| 亚洲高清成人av在线| 四虎永久在线精品无码视频| 亚洲 卡通 欧美 制服 中文| 国产老熟女一区二区三区| 一本久久a久久精品综合| 亚洲 小说区 图片区 都市| 邵阳市| 精品国产一区二区三区国产区| 精品国产成人A区在线观看| 秋霞人妻无码中文字幕| 免费看国产曰批40分钟| 四虎成人精品国产永久免费| 成人拍拍拍无遮挡免费视频| 久久天天躁狠狠躁夜夜网站| 亚洲国产成人久久77| 欧美va亚洲va在线观看| 亚洲精品天堂一区二区| 麻豆精产国品一二三区区| 日韩精品一区二区三区激情视频| 图片区 小说区 区 亚洲五月| 久久亚洲精品11p| 国产精品永久在线观看| 日区中文字幕一区二区| 狠狠色噜噜狠狠狠狠色综合久| 日韩av综合免费在线| 国产一区二区黄色在线观看| 日本韩国一区二区精品| 精品福利一区二区三区免费视频 | 伊人久久大香线蕉AV网禁呦|