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

标签 php laravel composer-php arabic dompdf

在我的项目中,我想将某个页面提取到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.ttfAmiri-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/

相关文章:

php - Laravel phpunit assertViewHas 与预期的测试数据不匹配

php - 无法下载 "https://getcomposer.org/versions"文件 : SSL operation failed with code 1. OpenSSL 错误消息:错误:1416F086

PHP MCRYPT - RIJNDAEL 128 白色 Mcrypt CBC 给出不正确的输出

php - 零售库存Mysql查询优化

javascript - 使卡片可拖动,卡片粘在上面的卡片上

laravel - Composer RuntimeException - 无法加载包 mews/purifier

php - 使用 PHP 清理 url

php - FROM 语句后选择更多的表?

docker - 在容器的每个构建中运行 composer install 和 npm install

php - php composer无法在public_html文件夹中访问