ab-alselwi / laravel-arabic-html
使用 ArPHP 和 dompdf 以及阿拉伯语字体和文本将 Laravel 视图转换为阿拉伯语 HTML(PDF)
Requires
- php: ^7.3||^8.0
- barryvdh/laravel-dompdf: ^1.0||^2.0
- illuminate/support: ^6|^7|^8|^9|^10
- illuminate/view: ^6|^7|^8|^9|^10
- khaled.alshamaa/ar-php: ^6.2
README
以更干净的方式处理阿拉伯文问题,无需修改 dompdf 脚本。
此包使用 laravel-dompdf 和 Ar-PHP 将视图 blade 转换为 PDF。
我们编写此包是为了在 laravel-dompdf 库中支持阿拉伯语,通过使用 Ar-PHP。如果这些库不存在,包将自动下载,无需单独下载。
此包目前仅提供一个函数 toArabicHTML(),同时您也可以使用原始库将任何内容转换为 PDF 文件。
内容
要求
- DOM 扩展
- MBString 扩展
- php-font-lib
- php-svg-lib
注意,某些必需依赖项可能有进一步的依赖项(特别是 php-svg-lib 需要 sabberworm/php-css-parser)。
推荐
- OPcache(OPcache、XCache、APC 等):提高性能
- GD(用于图像处理)
- IMagick 或 GMagick 扩展:提高图像处理性能
安装
包安装
使用 composer 安装包
composer require ab-alselwi/laravel-arabic-html
配置
只需在此处配置相关库。
默认配置设置在 config/dompdf.php
中。将此文件复制到您的配置目录以修改值。您可以使用以下命令发布配置
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"
建议指定字体目录为 storage\fonts 路径。
您需要在 config\dompdf 中设置 font_dir,通过将字体文件夹复制到 storage\fonts 或任何具有读写权限的文件夹。编写 CSS 和字体时请小心,您不能使用 font-weight:number(例如 font-weight:600),而应使用 font-weight:bold。
某些格式可能不在 dompdf 中得到支持,例如使用数字值的 font-weight,以及依赖于 flex box 的许多其他格式。如果存在不受支持的格式,您可以通过以下方式更改错误显示设置
'show_warnings' => true , // 在 dompdf 的警告上抛出异常
有关 dompdf 设置的更多信息
用法
以更干净的方式处理阿拉伯文问题,无需修改 dompdf 脚本。我们使用视图宏,因此使用 view('your_blade_view_name')>toArabicHTML() 支持任何阿拉伯语内容。 dompdf/dompdf#712 (comment)
函数参数
- $line_length :int ,optional, default 100. 每行的最大长度。
- $hindo :bool, optional, default false. 将文本中的数字转换为 hindu。
- $forcertl :bool, optional, default false. 强制文档方向从右到左。
此函数使用 Ar-PHP 库中的 utf8Glyphs 函数,因此您可以自定义此函数的参数,例如
- 1 - $line_length : 可选数字 - 如果存在较长的文本,您可能需要指定每行的字符数。我们已将默认值从 50 更改为 100 个字符。
- 2- $hindo : 可选的布尔逻辑值,如果您希望将文档中的数字转换为印度数字,我们已将默认值修改为false,这样数字将保持现状,以阿拉伯数字显示,当前使用的是英文语言。
- 3- $forcertl : 可选的布尔逻辑值,默认值为false,与原始函数值相同,表示从右到左转换文档方向。
示例
$html = view('invoice')->toArabicHTML(); $pdf = PDF::loadHTML($html)->output(); $headers = array( "Content-type" => "application/pdf", ); // Create a stream response as a file download return response()->streamDownload( fn () => print($pdf), // add the content to the stream "invoice.pdf", // the name of the file/stream $headers );
这是 view invoice.blade.php 视图的形式。
<!DOCTYPE html> <html dir="rtl"> <head> <title>Arabic Invoice </title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> * { font-family: DejaVu Sans !important; } body { font-size: 16px; font-family: 'DejaVu Sans', 'Roboto', 'Montserrat', 'Open Sans', sans-serif; padding: 10px; margin: 10px; color: #777; } body { color: #777; text-align: right; } body h1 { margin-bottom: 0px; padding-bottom: 0px; color: #000; } body h3 { margin-top: 10px; margin-bottom: 20px; color: #555; } body a { color: #06f; } @page { size: a4; margin: 0; padding: 0; } .invoice-box table { direction: ltr; width: 100%; text-align: right; border: 1px solid; font-family: 'DejaVu Sans', 'Roboto', 'Montserrat', 'Open Sans', sans-serif; } .row { display: block; padding-left: 24; padding-right: 24; page-break-before: avoid; page-break-after: avoid; } .column { display: block; page-break-before: avoid; page-break-after: avoid; } </style> </head> <body> <div class="row"> <div class="column"> <p class="text-darky">بيانات باللغة العربية </p> </div> </div> <h1>ان هذا عبارة عن قالب عادي </h1> <h3>ومن هنا قمنا بعرض قالب اعتيادي فقط كمثال توضيحي .</h3> <div class="invoice-box"> <table> <tr class="top"> <td colspan="2"> <table> <tr> <td class="title"> </td> <td> فاتورة #: 123<br /> الانشاء : يناير 1, 2015<br /> تاريخ : فبراير 1, 2015 </td> </tr> </table> </td> </tr> <tr class="heading"> <td>العنصر </td> <td>السعر </td> </tr> <tr class="item"> <td>تصميم موقع </td> <td>$300.00</td> </tr> <tr class="item"> <td>استضافة (3 أشهر )</td> <td>$75.00</td> </tr> <tr class="item "> <td>نطاق (1 عام )</td> <td>$10.00</td> </tr> <tr class="total last"> <td>الإجمالي : </td> <td>$385.00 </td> </tr> </table> <div> <p lang="ar"> انما نحن هنا نقوم بكتابة نصوص عربية فلما لا يكون هناك اخرى مما قد يحتم علينا أن نكتب أكثر.<br> وعليه فإن السطر هذا يعتبر سطر جديد </p> </div> </div> </body> </html>