2009-10-28 38 views
17

我試圖用這個片段來生成模板PDF:有沒有辦法使用django模板生成包含非ASCII字符的pdf格式的比薩?

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') 

所有非拉丁字符的顯示不正確,模板和視圖使用UTF-8編碼保存的。

我試着將視圖保存爲ANSI,然後保存爲用戶unicode(html,「UTF-8」),但它會引發TypeError。

另外我想也許這是因爲默認字體莫名其妙地不支持utf-8 ,所以根據比薩文檔,我嘗試在樣式部分設置模板體中的fontface。

這仍然沒有結果。

有沒有人有一些想法如何解決這個問題?

回答

28

這確實對我的工作:

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

嘗試

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

或校驗這個答案更換

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

html to pdf for a Django site?

+1

替換後得到pdf完整的不可讀數據, 檢查瞭解決方案,該方法與我使用的沒有多大差別,但我仍然使用html.encode(「ISO-8859-1」)對其進行測試拋出: 「拉丁-1」編解碼器無法編碼字符u'\ ufeff'在位置0:序號不在範圍(256)「 與編碼(」UTF-8「)它返回pdf,但與我一樣之前有過 - 非ascii符號仍然沒有正確渲染。 – mihailt 2009-10-28 13:51:09

+0

@mihailt你找到了解決方案嗎? – 2014-05-09 20:05:46

+0

正好加上這個:'encoding ='UTF-8''解決了我編碼波蘭字符的問題 – andi 2014-08-22 20:58:00

2

您需要修改djan去模板。在樣式表中添加一個新的字體,該字體將鏈接到包含文檔中使用字符的字體文件。該字體文件必須可以從您的服務器訪問(在Ubuntu下,您可以在/ usr/share/fonts/truetype /目錄中找到包含字體的文件)。例如:

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

然後,如果你有下一個HTML代碼:

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

,您可以顯示DejaMono字體,文字與此CSS規則:

div { font-family: DejaMono; } 

這對我的作品的時候我用西里爾字符生成PDF文檔。

0

如果您呼叫createPDF代替pisaDocument方法,你可以使用

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

我面臨同樣的問題,西里爾字符。

該解決方案包含兩個步驟:1. 指出字體文件在HTML文件中

2.給予「比薩」根路徑(以便它找到相對路徑字體文件) 我的情況是這樣的

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

因爲字體放在PATH_TO_DJANGO_PROJECT/files/arial。ttf

相關問題