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

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));

关键问题解决说明

  1. WinAnsi编码错误
    默认标准字体采用WinAnsi编码,不支持阿拉伯字符集。解决方案是嵌入支持阿拉伯语的TTF/OTF字体(如Noto Naskh Arabic、Amiri等),这类字体包含完整的阿拉伯字符映射。

  2. fontkit未注册错误
    pdf-lib从v1.11.0开始将fontkit拆分为独立包@pdf-lib/fontkit,必须显式调用pdfDoc.registerFontkit(fontkit)完成注册,才能嵌入自定义字体。

  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:12:44