在我的项目中,我想将某个页面提取到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
这有效并按应有的方式反转文本,但现在字母被分开了......(属于同一单词的阿拉伯字母被连接)
ex: ?????? 显示为?????????
这是该库的一个已知问题,尚未解决。一位评论员建议使用作曲家库chehivskiy/i18n-arabic
并将其用作
new \I18N_Arabic('Glyphs')
但我不断收到类未找到错误。该库没有任何命名空间。任何人都可以帮助我找到一个可以将阿拉伯语 HTML 转换为 PDF 的库,或者尝试找到一种方法来修复该库以使其正常工作,或者建议一种使用 Composer 非 Laravel 库的方法,例如
chehivskiy/i18n-arabic
在 Laravel 项目中。非常感谢。
第1步:使用composer安装最新版本的“Ar-PHP”库
composer require khaled.alshamaa/ar-php
第2步:将上述代码与控制器方法集成:
use PDF;
use ArPHP\I18N\Arabic;
class PurchaseController extends Controller {
function GeneratePDF(){
$reportHtml = view('pdf.purchase_pdf', [])->render();
$arabic = new Arabic();
$p = $arabic->arIdentify($reportHtml);
for ($i = count($p)-1; $i >= 0; $i-=2) {
$utf8ar = $arabic->utf8Glyphs(substr($reportHtml, $p[$i-1], $p[$i] - $p[$i-1]));
$reportHtml = substr_replace($reportHtml, $utf8ar, $p[$i-1], $p[$i] - $p[$i-1]);
}
$pdf = PDF::loadHTML($reportHtml);
return $pdf->download('purchase.pdf');
}
}
第3步:下载“Amiri”字体并将Amiri-Regular.ttf和Amiri-Bold.ttf文件放入字体目录中。
然后将 @font-face 规则添加到 view.blade.php 的 css 中,以定义新的自定义字体。
@font-face {
font-family: "Your_custom_font_name";
src: url("../fonts/Amiri-Regular.ttf") format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "Your_custom_font_name";
src: url("../fonts/Amiri-Bold.ttf") format('truetype');
font-weight: bold;
font-style: normal;
}
然后设置 view.blade.php 的 font-family
body {
font-family: "Your_custom_font_name";
}
就是这样。
注意: 要使用阿拉伯数字而不是印地语数字,您可以将 Arabic.php 文件中的 $hindo 参数设置为 false :
public function utf8Glyphs($text, $max_chars = 50, $hindo = false, $forcertl = false) {
...
}
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
类,如果您使用此库中的另一个类,您也需要为该类执行上述所有操作