You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:35:21