2015-01-27 24 views
9

Voglio generare file pdf da html usando Python + Flask. Per fare questo, io uso xhtml2pdf. Ecco il mio codice:Converti html in pdf usando Python/Flask

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 

In questo file di codice viene generato al volo. MA! xhtml2pdf non supporta molti stili nei CSS, a causa di questo grosso problema per contrassegnare correttamente la pagina. Ho trovato un altro strumento (wkhtmltopdf). Ma quando ho scritto qualcosa del tipo: errore

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

è stata sollevata:

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

E la mia domanda è come convertire HTML a PDF utilizzando wkhtmltopdf (con la generazione di file al volo) nel pallone?

Grazie in anticipo per le vostre risposte.

risposta

10

La pagina di bisogno di rendering, è possibile utilizzare PDFKit:

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

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

esempio nel documento.

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? 
+1

Ok.Questo codice funziona bene (excludind problemi con l'installazione wkhtmltopdf): rendered_template = render_template ('template.html', user = utente) rendered_template = rendered_template.encode ('utf-8') pdf = pdfkit.from_string (rendered_template, False, css = './static/styles.css') return make_response (pdf) Grazie! –

3

Hai provato con Flask-WeasyPrint, che utilizza WeasyPrint? Ci sono buoni esempi nei loro siti web quindi non li replica qui.

+0

Le istruzioni di installazione sembravano intimidatorie a causa delle dipendenze dei pacchetti, ma '' '' pip install weasyprint''' si occupava di tutto. – JohnMudd

+1

WeasyPrint non può gestire JavaScript. – Craicerjack

0

Conversion in 3 Steps from Webpage/HTML to PDF

Step1: Scarica libreria PDFKit

$ pip install pdfkit 

Step2: Scarica wkhtmltopdf

Per Ubuntu/Debian:

sudo apt-get install wkhtmltopdf 

Per Windows:

(a) Download link: WKHTMLTOPDF

(b) Impostare: impostare la cartella binaria variabile PATH nelle variabili d'ambiente.

Fase 3: codice in Python per scaricare:

(i) pagina HTML già salvato

import pdfkit 
pdfkit.from_file('test.html', 'out.pdf') 

(ii) Convertire da URL del sito web

import pdfkit 
pdfkit.from_url('https://www.google.co.in/','shaurya.pdf') 

(iii) Conservare testo in PDF

import pdfkit 
pdfkit.from_string('Shaurya Stackoverflow','SOF.pdf')