【问题标题】:How to get WKHTMLTOPDF working on Heroku?如何让 WKHTMLTOPDF 在 Heroku 上工作?
【发布时间】:2019-07-09 11:11:09
【问题描述】:

我创建了一个使用 PDFKIT 生成 PDF 的网站,并且我知道如何在 Window 上安装和设置环境变量路径。我设法在 Heroku 上部署了我的第一个网站,但现在在尝试生成 PDF 时出现错误“找不到 wkhtmltopdf 可执行文件:“b''”。 我不知道如何在 Heroku 上安装和设置 WKHTMLTOPDF,因为这是我第一次使用 Linux。 在问这个之前我真的尝试了一切,但即使遵循这个对我也不起作用。 Python 3 flask install wkhtmltopdf on heroku

如果可能,请逐步指导我如何安装和设置它。

我跟踪了所有资源和所有内容,但无法使其发挥作用。每次我得到同样的错误。 我使用的是 Django 版本 2。Python 版本 3.7。

这就是我做heroku stack得到的结果

可用堆栈 雪松 14 容器 heroku-16 * heroku-18

错误,我在生成 PDF 时遇到。 找不到 wkhtmltopdf 可执行文件:“b''” 如果此文件存在,请检查此进程是否可以读取它。否则请安装 wkhtmltopdf - https://github.com/JazzCore/python-pdfkit/wiki/Installing-wkhtmltopdf

我的网站在 localhost 上运行良好,没有任何问题,据我所知,我确信我在安装 wkhtmltopdf 时做错了。

谢谢

【问题讨论】:

    标签: python-3.x heroku django-wkhtmltopdf


    【解决方案1】:

    这是不平凡的。如果您想避免以下所有令人头疼的问题,您可以使用我的服务,api2pdf:https://github.com/api2pdf/api2pdf.python。否则,如果您想尝试解决它,请参见下文。

    1) 将此添加到您的 requirements.txt 中,以便为 heroku 和 pdfkit 安装一个特殊的 wkhtmltopdf 包。

    git+git://github.com/johnfraney/wkhtmltopdf-pack.git
    pdfkit==0.6.1
    

    2) 我在我的烧瓶应用程序中创建了一个 pdf_manager.py。在 pdf_manager.py 我有一个方法:

    def _get_pdfkit_config():
         """wkhtmltopdf lives and functions differently depending on Windows or Linux. We
          need to support both since we develop on windows but deploy on Heroku.
    
         Returns:
             A pdfkit configuration
         """
         if platform.system() == 'Windows':
             return pdfkit.configuration(wkhtmltopdf=os.environ.get('WKHTMLTOPDF_BINARY', 'C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe'))
         else:
             WKHTMLTOPDF_CMD = subprocess.Popen(['which', os.environ.get('WKHTMLTOPDF_BINARY', 'wkhtmltopdf')], stdout=subprocess.PIPE).communicate()[0].strip()
             return pdfkit.configuration(wkhtmltopdf=WKHTMLTOPDF_CMD)
    

    我有平台声明的原因是我在 Windows 机器上开发并且我的 PC 上有本地 wkhtmltopdf 二进制文件。但是当我部署到 Heroku 时,它在他们的 linux 容器中运行,所以我需要先检测我们在哪个平台上运行二进制文件。

    3) 然后我创建了另外两种方法 - 一种将 url 转换为 pdf,另一种将原始 html 转换为 pdf。

    def make_pdf_from_url(url, options=None):
        """Produces a pdf from a website's url.
        Args:
            url (str): A valid url
            options (dict, optional): for specifying pdf parameters like landscape
                mode and margins
        Returns:
            pdf of the website
        """
        return pdfkit.from_url(url, False, configuration=_get_pdfkit_config(), options=options)
    
    def make_pdf_from_raw_html(html, options=None):
        """Produces a pdf from raw html.
        Args:
            html (str): Valid html
            options (dict, optional): for specifying pdf parameters like landscape
                mode and margins
        Returns:
            pdf of the supplied html
        """
        return pdfkit.from_string(html, False, configuration=_get_pdfkit_config(), options=options)
    

    我使用这些方法转换为 PDF。

    【讨论】:

      【解决方案2】:

      只需按照以下步骤在 Heroku 上部署 Django 应用程序(pdfkit):

      第 1 步::在 requirements.txt 文件中添加以下包

      wkhtmltopdf-pack==0.12.3.0 
      pdfkit==0.6.0
      

      第 2 步: 在 vi​​ews.py 中添加以下行以添加二进制文件的路径

      import os, sys, subprocess, platform
      
      if platform.system() == "Windows":
              pdfkit_config = pdfkit.configuration(wkhtmltopdf=os.environ.get('WKHTMLTOPDF_BINARY', 'C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe'))
      else:
              os.environ['PATH'] += os.pathsep + os.path.dirname(sys.executable) 
              WKHTMLTOPDF_CMD = subprocess.Popen(['which', os.environ.get('WKHTMLTOPDF_BINARY', 'wkhtmltopdf')], 
                  stdout=subprocess.PIPE).communicate()[0].strip()
              pdfkit_config = pdfkit.configuration(wkhtmltopdf=WKHTMLTOPDF_CMD)
      

      第 3 步: 然后传递 pdfkit_config 作为参数,如下所示

      pdf = pdfkit.from_string(html,False,options, configuration=pdfkit_config)
      

      【讨论】:

      • 这个解决方案对我有用,我将wkhtmltopdf-pack 更改为wkhtmltopdf-pack-ng==0.12.3.0 谢谢!
      猜你喜欢
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      • 2011-11-07
      • 2016-06-14
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      相关资源
      最近更新 更多