NodeJS PDFKit插件的阿拉伯语文本问题

o2g1uqev  于 2023-02-15  发布在  Node.js
关注(0)|答案(4)|浏览(156)

要生成动态PDF文件,我使用PDFKit。生成工作正常,但我在显示阿拉伯字符时遇到问题,即使安装了阿拉伯字体。此外,阿拉伯文本生成正确,但我认为词序不正确。
作为一个例子,
我目前使用的pdfkit:"0.11.0"
正文:ˈ ˈ(你好你好)
字体:Amiri-Regular.ttf

const PDFDocument = require("pdfkit");
var doc = new PDFDocument({
  size: [595.28, 841.89],
  margins: {
    top: 0,
    bottom: 0,
    left: 0,
    right: 0,
  },
});
const customFont = fs.readFileSync(`${_tmp}/pdf/Amiri-Regular.ttf`);
doc.registerFont(`Amiri-Regular`, customFont);
doc.fontSize(15);
doc.font(`Amiri-Regular`).fillColor("black").text("مرحبا كيف حالك");
doc.pipe(fs.createWriteStream(`${_tmp}/pdf/arabic.pdf`));
doc.end();

输出:
PDF with arabic text

5uzkadbs

5uzkadbs1#

这个问题让我通过这里,但不幸的是,我不相信张贴的答案,甚至添加了一个库,以改变方向的文本与pdfkit.经过几分钟的pdfkit指南文档,这里是解决方案:

doc.text("مرحبا كيف حالك", {features: ['rtla']})
pvcm50d1

pvcm50d12#

你是对的,阿拉伯语单词的顺序是错的,你必须调整句子的方向
试着用这个

doc.rtl(true);

或This作为单行或文本的配置

doc.font(`Amiri-Regular`).fillColor("black").text("مرحبا كيف حالك", {rtl: true});
alen0pnh

alen0pnh3#

答案改编自信息here
1.安装软件包:npm install twitter_cldr
1.运行此函数以生成文本:

const TwitterCldr = TwitterCldrLoader.load("en");
     
private maybeRtlize(text: string) {
  if (this.isHebrew(text)) {
    var bidiText = TwitterCldr.Bidi.from_string(text, { direction: "RTL" });
    bidiText.reorder_visually();
    return bidiText.toString();
  } else {
    return text;
  }
}
     
Value = maybeRtlize("مرحبا كيف حالك")

doc.font(`Amiri-Regular`).fillColor("black").text(Value);

另一种可能的方法是反转文本(使用text.split(' ').reverse().join(' ');之类的方法,然而,虽然这对简单的阿拉伯语文本有效,但在引入英语数字时就会出现问题。因此,推荐使用第一种方法。

jhdbpxl9

jhdbpxl94#

我建议您根据需要执行以下操作之一
1)如果用于生成文档的doc.text函数数量较少,则可以将{features: ['rtla']}作为第二个参数添加到函数中,如下所示:

doc.text('تحية طيبة وبعد', { features: ['rtla'] });

2)如果你有很多对doc.text的调用,而不是在每个调用中添加{features: ['rtla']}作为参数,你可以通过迭代你的数据对象并颠倒词序来颠倒所有的文本,如下所示:

let str = "السلام عليكم ورحمة الله وبركاته";

str = str.split(' ').reverse().join(' ');

doc.text(str);

相关问题