Как заставить 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)