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

pdfkit对UTF-8全字符(含阿拉伯、韩、中文等)支持失效求助

解决PDFKit无法渲染阿拉伯语、韩语、中文等UTF-8字符的问题

核心原因

PDFKit自带的标准字体(如Helvetica、Times-Roman)仅覆盖基本ASCII及少量西方字符,不支持东亚、阿拉伯语这类复杂字符集,必须嵌入包含对应字符的TrueType/OpenType字体才能正常渲染。

具体解决方案

  • 选择支持多语言的字体:推荐使用Google开源的Noto系列字体(如Noto Sans),它支持几乎所有UTF-8字符,涵盖中文、韩语、阿拉伯语等多种语言;也可根据需求选择专用字体(如Noto Sans SC、Noto Sans KR)。
  • Node.js环境嵌入字体:
    将字体文件放置在项目目录中,通过font()方法加载并嵌入:
    const PDFDocument = require('pdfkit');
    const fs = require('fs');
    
    const doc = new PDFDocument();
    doc.pipe(fs.createWriteStream('multi-language.pdf'));
    
    // 加载本地Noto Sans字体
    doc.font('./NotoSans-Regular.ttf')
       .fontSize(14)
       .text('中文测试文本')
       .text('한글 테스트 문자')
       .text('العربية اختبار نص')
       .text('ㄱ ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎㅏ ㅑ ㅓ ㅕ ㅗ ㅛ ㅜ ㅠ ㅡ ㅣ');
    
    doc.end();
    
  • 浏览器环境嵌入字体:
    通过Fetch API加载字体文件转为ArrayBuffer后传入PDFKit:
    import PDFDocument from 'pdfkit';
    import blobStream from 'blob-stream';
    
    async function generateMultiLangPDF() {
      // 加载字体文件
      const fontBuffer = await fetch('/fonts/NotoSans-Regular.ttf').then(res => res.arrayBuffer());
      const doc = new PDFDocument();
      const stream = doc.pipe(blobStream());
    
      doc.font(fontBuffer)
         .fontSize(14)
         .text('多语言渲染测试:中文、韩语、阿拉伯语');
    
      doc.end();
      
      // 生成下载链接
      stream.on('finish', () => {
        const blob = stream.toBlob('application/pdf');
        const downloadLink = document.createElement('a');
        downloadLink.href = URL.createObjectURL(blob);
        downloadLink.download = 'multi-lang.pdf';
        downloadLink.click();
      });
    }
    
  • 阿拉伯语额外处理:阿拉伯语是从右到左(RTL)的书写系统,PDFKit原生对RTL排版支持不足,需借助rtl-converter等工具调整字符顺序后再渲染,确保文本排版符合阅读习惯。

验证

替换字体后重新生成PDF,检查各类UTF-8字符是否正常显示,可直接用你提供的韩语字符集测试验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 20:42:54