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

Django用xhtml2pdf生成尼泊尔语PDF出现黑方块问题求助

解决Django中xhtml2pdf渲染尼泊尔语PDF出现黑方块的问题

在Django项目中使用xhtml2pdf生成包含尼泊尔语内容的PDF时,非英文字符常显示为黑方块或乱码,核心原因是默认字体不支持Devanagari脚本(尼泊尔语使用的书写系统),以下是具体解决步骤:

1. 引入支持尼泊尔语的字体

xhtml2pdf依赖的ReportLab默认未包含尼泊尔语字体,需添加支持Devanagari的字体(如Noto Sans Devanagari、Arial Unicode MS):

  • 下载字体文件(例如NotoSansDevanagari-Regular.ttf),放入项目静态文件目录,比如static/fonts/
  • 在HTML模板的<style>中全局配置字体:
@font-face {
    font-family: 'NotoSansDevanagari';
    src: url('{% static "fonts/NotoSansDevanagari-Regular.ttf" %}') format('truetype');
    font-weight: normal;
    font-style: normal;
}

* {
    font-family: 'NotoSansDevanagari', sans-serif !important;
}

注意:服务器环境下需确保字体文件路径可访问,也可使用系统已安装的字体(需知道字体的系统名称)。

2. 确保编码与渲染流程正确

修改Python中的PDF生成逻辑,确保HTML以UTF-8编码传递给pisa:

from io import BytesIO
# ... 其他原有导入 ...

def render_to_pdf(template_src, context_dict={}):
    template = get_template(template_src)
    # 修正文件名拼接,避免重复.pdf
    invoice_title = f"{context_dict['invoice_title']}_{datetime.datetime.now().strftime('%Y%m%d%H%M%S')}.pdf"
    context_dict["invoice_title"] = invoice_title
    
    html = template.render(context_dict)
    response = HttpResponse(content_type="application/pdf")
    response["Content-Disposition"] = f"attachment; filename={invoice_title}"
    
    # 用BytesIO处理UTF-8编码的HTML内容
    html_bytes = html.encode("UTF-8")
    pisa_status = pisa.pisaDocument(
        BytesIO(html_bytes),
        response,
        encoding='UTF-8',
        # 处理静态文件路径,确保字体能被加载
        link_callback=lambda uri, rel: f"{settings.STATIC_URL}{uri.split(settings.STATIC_URL)[1]}"
    )
    
    if pisa_status.err:
        return HttpResponse(f"生成错误:<pre>{html}</pre>")
    return response

3. 验证模板编码设置

确认HTML模板的<head>中已正确声明UTF-8编码:

<meta charset="UTF-8">

完成以上步骤后,尼泊尔语字符应该能正常渲染,不会再出现黑方块或乱码。

内容的提问来源于stack exchange,提问作者prakash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:15:33