Как заставить WKHTMLTOPDF работать на Heroku?

Я создал веб-сайт, который генерирует PDF с использованием PDFKIT, и я знаю, как установить и настроить путь переменной среды в Window. Мне удалось развернуть мой первый веб-сайт на Heroku, но теперь я получаю сообщение об ошибке "Не найден исполняемый файл wkhtmltopdf: "b "". При попытке создать PDF-файл. Я понятия не имею, как установить и настроить WKHTMLTOPDF на Heroku, потому что это В первый раз я имею дело с Linux. Я действительно пытался все, прежде чем спросить это, но даже после этого у меня не работает. Python 3 колба установить wkhtmltopdf на heroku

Если возможно, пожалуйста, покажите мне пошаговое руководство по установке и настройке.

Я следил за всем ресурсом и всем, но не мог заставить его работать. Каждый раз, когда я получаю ту же ошибку. Я использую Django версии 2. Python версии 3.7.

Это то, что я получу, если сделаю стека герою

В наличии Стеки кедр-14, контейнер геройку-16 * геройку-18

Ошибка, которую я получаю при создании PDF. Не найден исполняемый файл wkhtmltopdf: "b''" Если этот файл существует, убедитесь, что этот процесс может его прочитать. В противном случае, пожалуйста, установите wkhtmltopdf - https://github.com/JazzCore/python-pdfkit/wiki/Installing-wkhtmltopdf

Мой сайт очень хорошо работает на localhost без каких-либо проблем, и, насколько я знаю, я уверен, что сделал что-то не так при установке wkhtmltopdf.

Спасибо

1 ответ

Решение

Это нетривиально. Если вы хотите избежать головной боли, описанной ниже, вы можете просто воспользоваться моим сервисом api2pdf: https://github.com/api2pdf/api2pdf.python. В противном случае, если вы хотите попробовать и пройти через это, см. Ниже.

1) Добавьте это в ваш файл require.txt, чтобы установить специальный пакет wkhtmltopdf для heroku, а также pdfkit.

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, и у меня есть локальный двоичный файл 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.

Просто выполните следующие действия, чтобы развернуть приложение Django (pdfkit) на Heroku:

Шаг 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)
Другие вопросы по тегам