2009-10-28 8 views
17

Sto cercando di generare un PDF da modello utilizzando questo frammento:C'è un modo per generare pdf contenente simboli non ascii con pisa dal template django?

def write_pdf(template_src, context_dict): 
    template = get_template(template_src) 
    context = Context(context_dict) 
    html = template.render(context) 
    result = StringIO.StringIO() 
    pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result) 
    if not pdf.err: 
     return http.HttpResponse(result.getvalue(), mimetype='application/pdf') 
    except Exception('PDF error') 

Tutti i simboli non latini non vengono visualizzati correttamente, il modello e la vista sono salvati con codifica UTF-8.

Ho provato a salvare la vista come ANSI e quindi a utente unicode (html, "UTF-8"), ma lancia TypeError.

Inoltre ho pensato che forse è perché i font predefiniti in qualche modo non supportano UTF-8 così in base alla documentazione pisa ho cercato di impostare fontface nel corpo modello nella sezione stile.

Che ancora non ha dato risultati.

Qualcuno ha qualche idea su come risolvere questo problema?

risposta

28

Questo funziona per me:

pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result, encoding='UTF-8') 
3

provare a sostituire

pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result) 

con

pdf = pisa.pisaDocument(StringIO.StringIO(html), result, encoding='UTF-8') 

O checkout questa risposta a html to pdf for a Django site?

+1

dopo aver sostituito pdf pieno di dati illeggibili, controllato la soluzione, il metodo non differisce molto da quello che uso, ma l'ho ancora testato, con html.encode ("ISO-8859-1") gira: Il codec "latin-1" non può codificare il carattere u '\ ufeff' in posizione 0: ordinale non compreso nell'intervallo (256) " con codifica (" UTF-8 ") restituisce pdf ma uguale a ho ottenuto in precedenza - i simboli non-ascii non sono ancora resi correttamente. – mihailt

+0

@mihailt hai trovato una soluzione? –

+0

aggiungendo esattamente questo: 'encoding = 'UTF-8'' ha risolto il mio problema con i caratteri di codifica dello smalto – andi

2

È necessario modificare il Djan vai modello. Aggiungi una nuova faccia di carattere nel foglio di stile che si collegherà a un file di font con caratteri usati nel tuo documento. E quel file di font deve essere accessibile dal tuo server (sotto Ubuntu puoi trovare i file con i font in/usr/share/fonts/truetype/directory). Per esempio:

@font-face { 
    font-family: DejaMono; 
    src: url(font/DejaVuSansMono.ttf); 
} 

Poi, se si ha accanto il codice HTML:

<div>Some non-latin characters</div> 

è possibile visualizzare il testo in font DejaMono con questa regola CSS:

div { font-family: DejaMono; } 

Questo funziona per me quando Genero documenti PDF con caratteri cirillici.

0

Se si chiama CreatePDF anziché il metodo pisaDocument, è possibile utilizzare

pisa.CreatePDF(html.encode('UTF-8'), response, link_callback=fetch_resources, encoding='UTF-8') 
1

Ho affrontato lo stesso problema con caratteri cirillici.

La soluzione conteneva due fasi: 1. Puntare il file di font nel file HTML

2. Dare "pisa" percorso principale (in modo che trovare il file del font da percorso relativo) in mio caso è stato qualcosa di simile

pdf = pisa.pisaDocument(html, result, path=PATH_TO_DJANGO_PROJECT) 

perché i font sono stati messi a PATH_TO_DJANGO_PROJECT/files/arial.ttf

Problemi correlati