Это нетривиально .Если вы хотите избежать головной боли, описанной ниже, вы можете просто воспользоваться моим сервисом 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.