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

参考pdfkit发票生成示例开发时遇俄文乱码,如何设置UTF-8编码

俄文PDF渲染乱码解决方法

这个乱码并非UTF-8编码配置错误导致,PDFKit本身的文本处理链路默认基于UTF-8编码工作,出现乱码的核心原因是:代码中未显式指定自定义字体,沿用了PDFKit内置的默认Helvetica字体,该字体的字符集仅覆盖基础拉丁字母与符号,完全不包含俄文使用的西里尔字母集,字符映射错位就会输出乱码内容。

具体修复配置

  • 第一步:准备带西里尔字符支持的字体文件
    选用开源的通用字体即可,比如Noto Sans、Roboto的常规字重版本,下载.ttf/.otf格式的字体文件放到项目资源目录下,注意确认字体的字符集覆盖包含西里尔字母。
  • 第二步:在输出俄文内容前,显式通过doc.font()方法加载对应字体
    不要依赖PDFKit的默认内置字体,只要在调用doc.text()输出俄文前完成字体加载,就能触发正确的字符映射。
  • 第三步:保持字体加载的一致性,不要在俄文文本渲染前切回内置默认字体,否则会再次出现乱码。

调整后的可运行参考代码

const fs = require('fs');
const PDFDocument = require('pdfkit');
const path = require('path');

function createInvoice(invoice, outputPath) {
  let doc = new PDFDocument({ margin: 50 });
  // 替换为项目内实际存放的支持西里尔字符的字体路径
  const cyrillicFontPath = path.join(__dirname, 'assets/fonts/NotoSans-Regular.ttf');
  generateHeader(doc, cyrillicFontPath);

  doc.end();
  doc.pipe(fs.createWriteStream(outputPath));
}

function generateHeader(doc, cyrillicFontPath) {
  doc
    .image("logo.png", 50, 45, { width: 50 })
    .fillColor("#444444")
    // 加载支持俄文的自定义字体后,再设置字号、输出文本
    .font(cyrillicFontPath)
    .fontSize(20)
    .text("Проверка", 110, 57)
    .fontSize(10)
    .text("Проверка", 100, 65, { align: "right" })
    .text("Проверка", 100, 80, { align: "right" })
    .moveDown();
}

常见避坑提示

  • 不需要额外手动设置UTF-8编码参数,只要字体覆盖对应字符集,俄文、中文、日文等非拉丁语言都可以正常通过默认UTF-8链路渲染。
  • 如果加载字体后仍存在部分字符乱码,检查所选字体的字符集拆分情况:部分字体的西里尔字符是单独打包的文件,需要加载对应带Cyrillic标识的字体版本才能完整覆盖俄文字符。
  • 尝试修改内置默认字体的编码参数解决乱码是无效操作,内置Helvetica是固定单字节映射的字体,本身不支持多字节的西里尔字符,无法通过参数调整适配俄文渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 18:27:02