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

无需整形库在pdfMake中正确渲染阿拉伯文PDF的技术问询

无需整形库,用pdfMake+Amiri字体正确渲染阿拉伯文PDF的方案

核心结论

可以仅通过pdfMake的原生配置+支持阿拉伯连写的字体(如你使用的Amiri)实现正确的RTL布局、字符连写,无需依赖第三方整形/双向文本库。

关键配置步骤

1. 确保字体加载正确

Amiri字体本身完全支持阿拉伯字符连写,只需确保在pdfMake中正确加载完整的OTF/TTF版本:

// Angular项目中结合VFS/base64配置pdfMake字体
pdfMake.fonts = {
  Amiri: {
    normal: 'Amiri-Regular.ttf', // 对应VFS中存储的字体文件名
    bold: 'Amiri-Bold.ttf',
    italics: 'Amiri-Italic.ttf',
    bolditalics: 'Amiri-BoldItalic.ttf'
  }
};

注意:不要使用裁剪过的字体版本,否则会缺失连写所需的字形(glyphs)。

2. 全局RTL与数字保留配置

在文档定义中设置全局默认样式,确保所有文本继承RTL方向,同时解决英文数字反转问题:

const docDefinition = {
  defaultStyle: {
    font: 'Amiri',
    direction: 'rtl', // 全局设置文本方向为RTL
    alignment: 'right', // 文本右对齐
    keepNativeNumbers: true // 禁止反转英文数字(如19不会变成91)
  },
  // 后续内容配置...
};

3. 文本块与容器的RTL保持

  • 不要手动反转文本或插入强制换行/空格:pdfMake的direction: 'rtl'会自动处理文本顺序,手动修改会破坏字符连写逻辑。
  • 多行文本直接使用原始阿拉伯字符串:
    content: [
      {
        text: 'نص طويل يتطلب перенس سطر، يجب أن يبقى اتجاهه من اليمين إلى اليسار حتى بعد الاقطاع.'
      }
    ]
    
  • 表格布局需设置表格全局RTL:
    content: [
      {
        table: {
          direction: 'rtl', // 表格整体RTL,所有单元格继承
          widths: ['*', '*'],
          body: [
            ['العنوان الأول', 'العنوان الثاني'],
            ['نص عربي في الخلية الأولى', 'أرقام 2024 في الخلية الثانية']
          ]
        }
      }
    ]
    

问题针对性解决

  • 字符无空格/连写失效:删除所有手动添加的空格或文本反转操作,让Amiri字体通过自身的GSUB/GPOS表自动处理连写。
  • 数字反转(如19→91):确保keepNativeNumbers: true已在全局或局部文本块中启用。
  • 换行后变为LTR:不要使用noWrap: true,确保容器(段落、表格单元格)的direction: 'rtl'配置生效,全局默认样式会自动继承到所有子元素。

注意事项

  • 避免使用任何文本反转函数或手动调整字符顺序,pdfMake的RTL配置会自动处理双向文本逻辑。
  • 若仍有局部文本异常,可在对应文本块中单独指定direction: 'rtl'覆盖,但优先使用全局配置保证一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:48:13