Django生成PDF时泰米尔语字符显示为方块的问题求助
解决Django模板转PDF时泰米尔语字符显示为方块的问题
问题根源是xhtml2pdf(你使用的pisa)默认字体不包含泰米尔语字符集,导致渲染PDF时无法解析泰米尔语,只能显示方块。以下是具体解决步骤:
1. 准备支持泰米尔语的字体
下载一款支持泰米尔语的开源字体(比如Noto Sans Tamil或Latha),将字体文件(如NotoSansTamil-Regular.ttf)放到Django项目的静态目录下,比如static/fonts/。
2. 修改HTML模板的CSS
在模板的<style>中通过@font-face引入自定义字体,并将文本元素的字体设置为该字体:
<html> <head> <title>Page Title</title> <meta charset="utf-8"> <style> @font-face { font-family: 'NotoSansTamil'; src: url('{{ STATIC_URL }}fonts/NotoSansTamil-Regular.ttf') format('truetype'); font-weight: normal; font-style: normal; } /* 让所有文本使用支持泰米尔语的字体 */ body, p { font-family: 'NotoSansTamil', sans-serif; } div { column-count: 2; column-width: 300px; } </style> </head> <body> <div class="col-md-6"> {% for i in recentsongs %} <p class="float-left">{{i.body |linebreaks}}</p> {% endfor %} </div> </body> </html>
3. 配置PDF生成时的字体路径
在views.py中添加字体配置,让pisa识别自定义字体的路径,修改后的代码如下:
from django.templatetags.static import static from xhtml2pdf import pisa import os from django.conf import settings def pdf(request,songsheetname): username=request.user.username printsong=Songsprintform.objects.all().filter(username=username,removesong='0', addsheetstatus='0',songsheetname=songsheetname,songprintstatus='1') countsong=Songsprintform.objects.all().filter(username=username,removesong='0', addsheetstatus='0',songsheetname=songsheetname,songprintstatus='1').count() songid = [] for i in printsong: songid.append(i.songprintid) recentsongs=SongList.objects.all().filter(id__in=songid) template_path = 'pdf.html' context = {'recentsongs':recentsongs} response = HttpResponse(content_type='application/pdf') response['Content-Disposition'] = 'filename="songs.pdf"' # 获取字体文件的绝对路径 font_path = os.path.join(settings.STATIC_ROOT, 'fonts', 'NotoSansTamil-Regular.ttf') # 配置字体映射 font_config = pisa.pisaFont() font_config.addFont('NotoSansTamil', font_path) template = get_template(template_path) html = template.render(context) # 传入字体配置生成PDF pisa_status = pisa.CreatePDF( html, dest=response, font_config=font_config ) if pisa_status.err: return HttpResponse('We had some errors <pre>' + html + '</pre>') return response
注意事项
- 确保
settings.py中正确配置了静态文件路径:STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') - 运行前执行
python manage.py collectstatic,确保静态文件被正确收集到STATIC_ROOT目录。 - 如果使用其他字体,替换代码中对应的字体文件名和
font-family名称即可。
内容的提问来源于stack exchange,提问作者subash web
相关产品推荐
相关产品推荐

