Node.js中使用pdf-lib编辑PDF添加阿拉伯文本的问题求助
Node.js 编辑PDF并添加阿拉伯文本的可行方案
前置依赖安装
先确保安装所需包:
npm install pdf-lib @pdf-lib/fontkit fs-extra
完整PoC函数/控制器
以下是可直接运行的示例,包含读取现有PDF、嵌入阿拉伯字体、添加RTL文本的完整逻辑:
const { PDFDocument } = require('pdf-lib'); const fontkit = require('@pdf-lib/fontkit'); const fs = require('fs-extra'); async function addArabicTextToPDF(inputPath, outputPath, arabicText, x, y, fontSize = 12) { // 读取现有PDF(必须用二进制buffer,不能用UTF-8编码) const existingPdfBytes = await fs.readFile(inputPath); // 加载PDF文档 const pdfDoc = await PDFDocument.load(existingPdfBytes); // 注册fontkit,解决自定义字体嵌入问题 pdfDoc.registerFontkit(fontkit); // 嵌入支持阿拉伯语的自定义字体(需自行准备字体文件,比如Noto Naskh Arabic) const fontBytes = await fs.readFile('./fonts/NotoNaskhArabic-Regular.ttf'); const arabicFont = await pdfDoc.embedFont(fontBytes); // 获取目标页面(示例为第一页,可按需修改页码) const targetPage = pdfDoc.getPages()[0]; // 添加阿拉伯文本,必须设置RTL方向 targetPage.drawText(arabicText, { x: x, y: y, size: fontSize, font: arabicFont, color: rgb(0, 0, 0), textDirection: 'rtl', // 阿拉伯语为从右到左书写,此参数为必填 }); // 保存修改后的PDF const modifiedPdfBytes = await pdfDoc.save(); await fs.writeFile(outputPath, modifiedPdfBytes); console.log(`阿拉伯文本已添加完成,输出文件:${outputPath}`); } // 辅助函数:生成PDF可用的RGB颜色值 function rgb(r, g, b) { return { r: r / 255, g: g / 255, b: b / 255 }; } // 调用示例 addArabicTextToPDF( './input.pdf', './output.pdf', 'مرحبا بالعالم', // 阿拉伯语:你好世界 50, 100, 16 ).catch(err => console.error('处理失败:', err));
关键问题解决说明
WinAnsi编码错误
默认标准字体采用WinAnsi编码,不支持阿拉伯字符集。解决方案是嵌入支持阿拉伯语的TTF/OTF字体(如Noto Naskh Arabic、Amiri等),这类字体包含完整的阿拉伯字符映射。fontkit未注册错误
pdf-lib从v1.11.0开始将fontkit拆分为独立包@pdf-lib/fontkit,必须显式调用pdfDoc.registerFontkit(fontkit)完成注册,才能嵌入自定义字体。PDF解析错误(No PDF header found)
PDF是二进制格式,不能以UTF-8编码读写。必须直接操作二进制buffer(示例中fs.readFile默认返回buffer,fs.writeFile直接写入buffer),禁止使用encoding: 'utf8'参数。
注意事项
- 需自行下载阿拉伯字体文件,放在项目指定目录(示例为
fonts文件夹) - PDF坐标系统以左下角为原点,需根据页面实际尺寸调整x、y值
- 多行阿拉伯文本需自行处理换行逻辑,可配合
lineHeight参数实现
内容的提问来源于stack exchange,提问作者MisterKing 7
相关产品推荐
相关产品推荐

