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

