Куда мне следует поместить config_custom.php после того, как я добавил собственный шрифт kartik yii-mpdf в yii2

После того, как я создам собственный файл конфигурации для изменения типа шрифта в mpdf-yii2, куда мне следует поместить этот файл и как его вызвать. это custom_config.php

<?php
require_once __DIR__ . '/vendor/autoload.php';

$defaultConfig = (new Mpdf\Config\ConfigVariables())->getDefaults();
$fontDirs = $defaultConfig['fontDir'];

$defaultFontConfig = (new Mpdf\Config\FontVariables())->getDefaults();
$fontData = $defaultFontConfig['fontdata'];

$mpdfConfig = new \Mpdf\Mpdf([
        'mode' => 'utf-8',
        'format' => [190, 236],
        'tempDir' => __DIR__ . '/web/css/fonts',
        'fontDir' => array_merge($fontDirs, [
            __DIR__ . 'web/css/fonts/tajawal'
        ]),
        'fontdata' => $fontData + [
                'tajawal' => [
                 'R' => "Tajawal-Regular.ttf",
                'L' => "Tajawal-Light.ttf",
                'B' => "Tajawal-Bold.ttf",
                'useOTL' => 0xFF,
                'useKashida' => 75,
                ],
            ],
        'default_font' => 'tajawal'
]);

это конфигурация этой библиотеки в /config/web.php

   'pdf' => [
            'class' => Pdf::classname(),
            'format' => Pdf::FORMAT_A4,
            'orientation' => Pdf::ORIENT_PORTRAIT,
            'destination' => Pdf::DEST_BROWSER,
            'cssFile' => '@vendor/kartik-v/yii2-mpdf/src/assets/kv-mpdf-bootstrap.min.css',
            'cssInline' => '.row { margin: 5px 0px 0px 0px !important; padding: 0px !important; }',
            'methods' => [
                'SetTitle' => 'Title',
            ],
        ],

и этот код в контроллере.php

 $pdf = Yii::$app->pdf;
        $pdf->methods = [
            'SetTitle' => $pdfTitle ,
        ];

        $mpdf = $pdf->api;
        $mpdf->setAutoBottomMargin = 'pad';

        if ($language == 0) {
            $mpdf->SetDirectionality('ltr');
        } else {
            $mpdf->SetDirectionality('rtl');
        }
        $pdf->content = $content;

        return $pdf->render();

Я попробую, этот код добавил опции

      'pdf' => [
            'class' => Pdf::classname(),
            'format' => Pdf::FORMAT_A4,
            'orientation' => Pdf::ORIENT_PORTRAIT,
            'destination' => Pdf::DEST_BROWSER,
            'cssFile' => '@vendor/kartik-v/yii2-mpdf/src/assets/kv-mpdf-bootstrap.min.css',
            // 'marginLeft'=>0,
            // 'marginRight'=>0,
            // 'marginFooter'=>20,
            'cssInline' => '.row { margin: 5px 0px 0px 0px !important; padding: 0px !important; }',
            'methods' => [
                'SetTitle' => 'Title',
      
            ],
            'options' => [
                'config' =>  $_SERVER['DOCUMENT_ROOT'].'/css/fonts/config-fonts.php',
            ],

🤔 А знаете ли вы, что...
PHP поддерживает работу с куки для управления данными между запросами.


57
1

Ответ:

Решено

Смотрим исходный код kartik\mpdf\Pdfкласса. Он создает собственный экземпляр объекта Mpdf. Поэтому создание собственного экземпляра в custom_config.php не поможет вам при работе с Yii::$app->pdf.

Глядя на то, как экземпляр Mpdf создается внутри класса Pdf, все, что установлено в его свойстве options, будет передано в Mpdf как параметр конструктора после того, как некоторые значения будут перезаписаны свойствами компонента Pdf. Это означает, что все, что вы передаете конструктору Mpdf в своем custom_config.php, необходимо настроить в свойстве options при настройке Pdf компонента.

Чтобы сохранить ваш config/web.php в чистоте, вы можете подготовить параметры в дополнительном файле, например config/pdf.php:

$defaultConfig = (new Mpdf\Config\ConfigVariables())->getDefaults();
$fontDirs = $defaultConfig['fontDir'];

$defaultFontConfig = (new Mpdf\Config\FontVariables())->getDefaults();
$fontData = $defaultFontConfig['fontdata'];

return [
    // your font configurations
    'fontDir' => array_merge($fontDirs, [
        dirname(__DIR__) . '/web/css/fonts/tajawal', // the dirname() is used here because __DIR__ points to `config` directory.
    ]),
    'fontdata' => $fontData + [
        'tajawal' => [
            'R' => "Tajawal-Regular.ttf",
            'L' => "Tajawal-Light.ttf",
            'B' => "Tajawal-Bold.ttf",
            'useOTL' => 0xFF,
            'useKashida' => 75,
        ],
    ],
    // keep defaults that are set up in Pdf::$options
    'autoScriptToLang' => true,
    'ignore_invalid_utf8' => true,
    'tabSpaces' => 4,
];

Как видите, я исключил параметры mode, format, tempDir и default_font, поскольку они перезаписываются свойствами компонента Pdf, поэтому нам нужно установить их там. Вам не нужно требовать vendor/autoload.php, поскольку он уже включен в файл web/index.php до загрузки конфигурации.

Теперь нам нужно использовать этот файл в настройках вашего компонента Pdf в config/web.php.

'pdf' => [
    'class' => Pdf::classname(),
    'format' => Pdf::FORMAT_A4,
    'orientation' => Pdf::ORIENT_PORTRAIT,
    'destination' => Pdf::DEST_BROWSER,
    'cssFile' => '@vendor/kartik-v/yii2-mpdf/src/assets/kv-mpdf-bootstrap.min.css',
    'cssInline' => '.row { margin: 5px 0px 0px 0px !important; padding: 0px !important; }',
    'methods' => [
        'SetTitle' => 'Title',
    ],
    'mode' => Pdf::MODE_UTF8, // we will use constant defined in Pdf class instead of plain text
    'tempPath' => dirname(__DIR__) . '/web/css/fonts', // tempDir uses tempPath property instead. Make sure the path to temp dir matches actual directory structure
    'defaultFont' => 'tajawal',
    'options' => require __DIR__ . '/pdf.php', // here we use the extra file with pdf configuration we've prepared
],

Это должно гарантировать, что экземпляр Mpdf в компоненте Pdf создан с настроенной вами конфигурацией.