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

