ab-alselwi/laravel-arabic-html

使用 ArPHP 和 dompdf 以及阿拉伯语字体和文本将 Laravel 视图转换为阿拉伯语 HTML(PDF)

0.2.0 2023-05-24 15:04 UTC

This package is auto-updated.

Last update: 2024-09-24 19:14:06 UTC


README

以更干净的方式处理阿拉伯文问题,无需修改 dompdf 脚本。

此包使用 laravel-dompdfAr-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>