这是不平凡的。如果您想避免以下所有令人头疼的问题,您可以使用我的服务 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。