Преобразование html в pdf с помощью Python/Flask

Я хочу сгенерировать pdf-файл из html, используя Python + Flask. Для этого я использую xhtml2pdf. Вот мой код:

def main():
    pdf = StringIO()
    pdf = create_pdf(render_template('cvTemplate.html', user=user))
    pdf_out = pdf.getvalue()
    response = make_response(pdf_out)
    return response

def create_pdf(pdf_data):
    pdf = StringIO()
    pisa.CreatePDF(StringIO(pdf_data.encode('utf-8')), pdf)
    return pdf

В этом коде файл генерируется на лету. НО! xhtml2pdf не поддерживает многие стили в CSS из-за этой большой проблемы с правильной разметкой страницы. Я нашел другой инструмент (wkhtmltopdf). Но когда я написал что-то вроде:

pdf = StringIO()
data = render_template('cvTemplate1.html', user=user)
WKhtmlToPdf(data.encode('utf-8'), pdf)
return pdf

Была поднята ошибка:

AttributeError: 'cStringIO.StringO' object has no attribute 'rfind'

И мой вопрос: как преобразовать html в pdf с помощью wkhtmltopdf (с созданием файла на лету) в Flask?

Заранее спасибо за ваши ответы.


person Dmitry_Mahrachev    schedule 27.01.2015    source источник


Ответы (3)


Страница нуждается в рендеринге, вы можете использовать pdfkit:

https://pypi.python.org/pypi/pdfkit

https://github.com/JazzCore/python-pdfkit

Пример в документе.

import pdfkit

pdfkit.from_url('http://google.com', 'out.pdf')
pdfkit.from_file('test.html', 'out.pdf')
pdfkit.from_string('Hello!', 'out.pdf')  # Is your requirement?
person kiyomi    schedule 27.01.2015
comment
Ok. Этот код работает нормально (исключая проблемы с установкой wkhtmltopdf): rendered_template = render_template('template.html', user=user) rendered_template = rendered_template.encode('utf-8') pdf = pdfkit.from_string(rendered_template, False, css= './static/styles.css') возвращает make_response(pdf) Спасибо! - person Dmitry_Mahrachev; 28.01.2015
comment
но нужно установить wkhtmlpdf - person Ganesan J; 23.06.2021
comment
он работает локально. Но не может быть установлен в cpanel (живой сервер). Как установить wkhtmlpdf в cpanel - person Ganesan J; 23.06.2021

Пробовали ли вы использовать Flask-WeasyPrint, который использует WeasyPrint? На их веб-сайтах есть хорошие примеры, поэтому я не буду их воспроизводить здесь.

person chfw    schedule 27.01.2015
comment
Инструкции по установке выглядели пугающе из-за зависимостей пакетов, но pip install weasyprint обо всем позаботился. - person JohnMudd; 23.12.2015
comment
WeasyPrint не может обрабатывать JavaScript. - person Craicerjack; 25.09.2017
comment
WeasyPrint поддерживает CSS2.1, но не упоминает о поддержке js. Поэтому, если на данный момент требуется поддержка js, я бы сказал, что pypuppeteer может помочь. - person chfw; 18.11.2018