问题描述
在我的项目中,我想将某个页面提取到 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
类,如果您使用的是该库中的另一个类,则还需要为该类执行上述所有操作