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

使用wkhtmltopdf knp snappy转换乌尔都语PDF出现字符异常求助

解决wkhtmltopdf + KnpSnappy生成PDF时乌尔都语显示异常的问题
  • 强制指定乌尔都语字体(核心解决步骤)
    先确认服务器/本地环境安装了支持乌尔都语的字体,比如Noto Nastaliq Urdu、Urdu Naskh Asiatype这类字体。
    不要只依赖字体名称,直接在HTML的CSS里用绝对路径指定字体文件,确保wkhtmltopdf能精准加载:

    @font-face {
        font-family: 'UrduFont';
        src: url('/absolute/path/to/NotoNastaliqUrdu-Regular.ttf') format('truetype');
        font-weight: normal;
        font-style: normal;
    }
    body, .urdu-text {
        font-family: 'UrduFont', sans-serif !important;
    }
    

    本地测试用绝对路径,生产环境要保证字体文件可访问,也可以把字体打包到项目目录里。

  • 调整wkhtmltopdf渲染参数
    在KnpSnappy配置里添加以下参数,强制启用字体嵌入和正确渲染:

    $snappy = new Pdf('/path/to/wkhtmltopdf');
    $snappy->setOption('encoding', 'UTF-8');
    $snappy->setOption('no-pdf-compression', true); // 避免字体被压缩丢失
    $snappy->setOption('enable-local-file-access', true); // 允许加载本地字体
    $snappy->setOption('dpi', 300); // 提升分辨率,解决字符方块问题
    

    要是Symfony项目,直接在config/packages/knp_snappy.yaml里配置:

    knp_snappy:
        pdf:
            enabled: true
            binary: '%env(WKHTMLTOPDF_PATH)%'
            options:
                encoding: 'UTF-8'
                no-pdf-compression: true
                enable-local-file-access: true
                dpi: 300
    
  • 修正HTML编码与结构
    确保HTML头部明确声明UTF-8编码,不要遗漏:

    <meta charset="UTF-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    

    乌尔都语是从右到左的语言,给包含乌尔都语的元素加上dir="rtl"属性,避免排版错乱:

    <div class="urdu-text" dir="rtl">乌尔都语文本内容</div>
    
  • 验证字体嵌入情况
    生成PDF后,用Adobe Acrobat这类阅读器查看文档属性的字体列表,确认指定的乌尔都语字体已被嵌入。如果没找到,说明wkhtmltopdf没加载到字体,要检查路径权限或字体文件是否损坏。
    也可以直接用命令行测试,排除KnpSnappy的影响:

    wkhtmltopdf --encoding UTF-8 --enable-local-file-access --dpi 300 input.html output.pdf
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:40:11