Laravel domPDF 阿拉伯字符生成 PDF 错误

问题描述

在我的项目中,我想将某个页面提取到 PDF 文件中。该页面主要使用阿拉伯语。

我正在使用 barryvdh/laravel-dompdf 第一次尝试时,没有显示字符,只有问号。

经过仔细研究,我发现我应该将以下 CSS 添加到我的刀片页面中:

* { 
    font-family: DejaVu Sans,sans-serif; 
    direction: rtl;
}

现在阿拉伯字母显示在 PDF 中,但它们的顺序颠倒了(ABC 是 CBA)。 经过另一轮研究,我在某处找到了一个解决方案,我应该将以下内容添加到我的 dompdf/dompdf/src/Renderer/Text.PHP 之前

if (strtolower($style->direction) == 'rtl') {
    preg_match_all('/./us',$text,$ar);
    $text = join('',array_reverse($ar[0]));
}

// this is added here to kNow where exactly i put this code
$this->_canvas->text($x,$y,$text

这可以正常工作并按原样反转文本,但是现在字母被分开了......(属于同一个单词的阿拉伯字母被连接)

例如:البناء 显示为 ا ل ب ن ا ء

这是该库的一个已知问题,尚未解决。其中一位评论员建议使用作曲家库 chehivskiy/i18n-arabic‬ 并将其用作 new \I18N_arabic('Glyphs')

但是我不断收到找不到类的错误。这个库没有任何命名空间。

任何人都可以帮助我找到一个可以将阿拉伯语 HTML 转换为 PDF 的库,或者尝试找到一种方法来修复该库使其正常工作,或者建议一种使用 Composer 非 Laravel 库的方法例如 Laravel 项目中的 chehivskiy/i18n-arabic‬

非常感谢。

解决方法

好吧,我做了什么,我删除了 Composer 库 chehivskiy/i18n-arabic‬ 并下载了 ar-php,它有点相同,但不是通过 Composer。

我将提取的 I18N 放在我创建的 app/Libraries 目录中。

接下来我将 Arabic.php 的名称更改为 I18N_Arabic.php 以与其中的类名称相同。请注意,该文件 ArabicException 中有另一个类,我将其放入自己的文件中。

我还在该文件中添加了一个命名空间 namespace App\Libraries\I18N;

接下来,由于我在 Glyph 中使用了 app\Libraries\I18N\Arabic\Glyphs.php 类,我也为它做了同样的事情,将其文件名更改为 I18N_Arabic_Glyphs 以匹配类名并添加命​​名空间namespace App\Libraries\I18N\Arabic;

接下来回到我的 I18N_Arabic 类,替换以下内容:

$this->myClass = '\I18N_Arabic_' . $library;
$class         = '\I18N_Arabic_' . $library;

$this->myClass = 'App\Libraries\I18N\Arabic\I18N_Arabic_' . $library;
$class         = 'App\Libraries\I18N\Arabic\I18N_Arabic_' . $library;

并删除以下内容:

if (!$this->_useAutoload) {
    include self::getClassFile($this->myFile); 
}

最后,在 vendor\dompdf\dompdf\src\Renderer\Text.php 中,搜索 $this->_canvas->text($x,$y,$text, 并将以下内容放在其前面:

$Arabic = new \App\Libraries\I18N\I18N_Arabic('Glyphs');
$text = $Arabic->utf8Glyphs($text);

就是这样。现在使用上面包中提供的 PDF 类将生成格式正确的阿拉伯语 pdf。

请注意,这里我使用的是 Glyph 类,如果您使用的是该库中的另一个类,则还需要为该类执行上述所有操作