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
相关产品推荐
相关产品推荐

