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

Node.js中使用pdfkit生成阿拉伯文本时数字反转问题求助

在Node.js中使用PDFKit生成PDF时阿拉伯文本数字反转的解决方案

我在Node.js应用中使用pdfkit包生成PDF,但生成阿拉伯文本时遇到问题:阿拉伯文本中的数字总是被反转。例如我想写入‘ساڵی 1992(1992年)’,结果总是变成‘ساڵی ٢٩٩١’,即便使用Unicode自定义字体,该问题仍然存在。

示例效果:
示例图片

当前使用的代码:

function generatePDFForRuleAndRegulation(data) {
  const fileNamePDF = `${data.name}.pdf`;
  const doc = new PDFDocument();

  // Pipe the PDF document to a writable stream (file in this case)
  const stream = fs.createWriteStream(fileNamePDF);

  doc.pipe(stream);

  doc
    .font(`${path.join(__dirname, "../../assets/fonts/NRT-Reg.ttf")}`)
    .fontSize(12)
    .text(`${data.name}`, {
      align: "center",
    });
  doc.moveDown(); // Move cursor down

  doc
    .font(`${path.join(__dirname, "../../assets/fonts/Rabar_021.ttf")}`)
    .fontSize(10)
    .text(data.text, { align: "right", features: ["rtla"] });

  // Finalize the PDF document
  doc.end();

  // Inform when the file has been created
  stream.on("finish", () => {
    console.log(`PDF created: ${fileNamePDF}`);
  });
}

解决方案与变通方法

1. 用Unicode控制字符强制数字LTR渲染

PDFKit在RTL模式下会反转数字顺序,可通过添加**左到右标记(\u200E)**包裹数字,强制数字按正确顺序显示。用正则表达式批量处理文本中的数字:

function generatePDFForRuleAndRegulation(data) {
  const fileNamePDF = `${data.name}.pdf`;
  const doc = new PDFDocument();
  const stream = fs.createWriteStream(fileNamePDF);

  doc.pipe(stream);

  doc
    .font(`${path.join(__dirname, "../../assets/fonts/NRT-Reg.ttf")}`)
    .fontSize(12)
    .text(`${data.name}`, { align: "center" });
  doc.moveDown();

  // 处理文本中的数字,添加左到右控制字符
  const processedText = data.text.replace(/(\d+)/g, '\u200E$1\u200E');

  doc
    .font(`${path.join(__dirname, "../../assets/fonts/Rabar_021.ttf")}`)
    .fontSize(10)
    .text(processedText, { align: "right", features: ["rtla"] });

  doc.end();

  stream.on("finish", () => {
    console.log(`PDF created: ${fileNamePDF}`);
  });
}

2. 显式设置文本方向为RTL

尝试同时设置direction: 'rtl'选项,增强PDFKit对RTL文本的识别:

doc
  .font(`${path.join(__dirname, "../../assets/fonts/Rabar_021.ttf")}`)
  .fontSize(10)
  .text(processedText, { align: "right", direction: 'rtl', features: ["rtla"] });

3. 更换PDF生成库

如果PDFKit的方案仍不满足需求,可尝试以下更适配RTL文本的库:

  • jsPDF:支持自定义阿拉伯字体,通过设置setFont和text方法的rtl参数实现正确排版,配合插件可处理复杂文档。
  • Puppeteer:通过无头Chrome渲染带dir="rtl"属性的HTML页面生成PDF,HTML对RTL文本和数字的原生支持更完善,适合复杂排版场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:23:23