如何使WKHTMLTOPDF在Heroku上工作?

时间:2019-02-15 10:17:27

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

我创建了一个使用PDFKIT生成PDF的网站,并且我知道如何在Window上安装和设置环境变量路径。我设法在Heroku上部署了我的第一个网站,但是现在我收到错误消息“找不到wkhtmltopdf可执行文件:“ b”“。 我不知道如何在Heroku上安装和设置WKHTMLTOPDF,因为这是我第一次使用Linux。 在问这个问题之前,我确实尝试了所有方法,但即使这样做也没有用。 Python 3 flask install wkhtmltopdf on heroku

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

我跟踪了所有资源和所有内容,但是无法正常工作。每次我遇到相同的错误。 我正在使用Django版本2。Python版本3.7。

这是我做heroku堆栈后得到的结果

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

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

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

谢谢

2 个答案:

答案 0 :(得分:1)

这很简单。如果您想避免以下所有麻烦,可以使用api2pdf我的服务: https://github.com/api2pdf/api2pdf.python 。否则,如果您想尝试解决它,请参见下文。

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

for (int i = 0; i < arr.length(); i++) {

          JSONObject jsonPart = arr.getJSONObject(i);
          partite.add(new Partita(jsonPart.getString("HomeTeam"), 
          jsonPart.getString("AwayTeam"),jsonPart.getString("Date"), 
          jsonPart.getInt("FTHG"), jsonPart.getInt("FTAG"), 
          jsonPart.getString("FTR")));

          partitemap.put(i, partite.get(i));

          Log.i("partita", partite.get(i).HT + " " + partite.get(i).HG + ":" + partite.get(i).AG + " " + partite.get(i).AT);

                }

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

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

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

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

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)

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

答案 1 :(得分:0)

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

步骤1: :将以下软件包添加到requirements.txt文件中

wkhtmltopdf-pack==0.12.3.0 
pdfkit==0.6.0

步骤2: 在views.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)