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

问题描述 投票:0回答:2

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

非常感谢。

php laravel composer-php arabic dompdf
2个回答
2
投票
这个解决方案对我有用。我已经将它与 Laravel 8 一起使用了,如下所示:


第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.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 的 font-family 

body { font-family: "Your_custom_font_name"; }
就是这样。


注意: 要使用阿拉伯数字而不是印地语数字,您可以将 Arabic.php 文件中的 $hindo 参数设置为 false :

public function utf8Glyphs($text, $max_chars = 50, $hindo = false, $forcertl = false) { ... }
    

1
投票
好吧,我做了什么,我删除了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

 类,如果您使用此库中的另一个类,您也需要为该类执行上述所有操作

© www.soinside.com 2019 - 2024. All rights reserved.