在我的项目中,我想将某个页面提取到PDF文件中。该页面主要是阿拉伯语。
我正在使用barryvdh/laravel-dompdf 第一次尝试时,没有显示任何字符,只有问号。
经过深入研究,我发现我应该将以下 CSS 添加到我的 Blade 页面:
* {
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
这可以正常工作并反转文本,但现在字母被分开了......(属于同一单词的阿拉伯字母被连接)
例如:??? 显示为 ??????
这是该库的一个已知问题,但尚未解决。一位评论员建议使用 Composer 库 chehivskiy/i18n-arabic
并将其用作 new\I18N_Arabic('Glyphs')
但我不断收到类未找到错误。该库没有任何命名空间。
任何人都可以帮助我找到一个可以将阿拉伯语 HTML 转换为 PDF 的库,或者尝试找到一种方法来修复该库以使其正常工作,或者建议一种使用 Composer 非 Laravel 库的方法例如 Laravel 项目中的 chehivskiy/i18n-arabic
。
非常感谢。
最佳答案
这个解决方案适合我。我已经将它与 laravel 8 一起使用,如下所示:
第1步:使用composer安装最新版本的“Ar-PHP”库
composer require khaled.alshamaa/ar-php
第 2 步:将上述代码与 Controller 方法集成:
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" font并将 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 的字体系列
body {
font-family: "Your_custom_font_name";
}
就是这样。
注意:要使用阿拉伯数字而不是印地语数字,您可以将 Arabic.php 文件中的 $hindo 参数设置为 false:
public function utf8Glyphs($text, $max_chars = 50, $hindo = false, $forcertl = false) {
...
}
关于php - Laravel domPDF阿拉伯字符生成PDF错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67462233/