راهنمای سریع کتابخانه‌ی mPDF (ساختن PDF در php)

بعد از تست چندین و چند کتابخانهی ساخت و ایجاد PDF برای زبان php بالاخره mPDF را پیدا کردم و مدت زیادی است که با آن کار میکنم و از عملکرد این کتابخانه راضی هستم.

مشکلاتش را برای خودم حل کردهام و به زیر و بماش تا حدودی آشنا شدهام و امروز تصمیم گرفتم یک راهنمای کوتاه و سریع برای استفاده از این کتابخانه بنویسم که شاید به درد کسی دیگر هم بخورد.

سایت داکیومنت mPDF در این آدرس موجود است و لینک به گیتهاب و بقیه اطلاعات و منابع نیز در این سایت موجود است.

نصب

برای نصب میتوانید از کامپوزر استفاده کنید:

composer require mpdf/mpdf

پس از نصب، باید کتابخانه را در پروژهی خود لود کنید که اگر از فریمورک استفاده میکنید با معرفی کتابخانه در autoload فریمورک خود و اگر از کد سادهی php استفاده میکنید با include کردن فایل mpdf.php در پروژهی خود این کار انجام میشود.

حالا میرسیم سر اصل کار.

کتابخانهی mPDF به روشهای متنوعی میتواند pdf بسازد و دست شما برای هر کاری باز است.

سادهترین حالت استفاده

سادهترین کار این است که در یک صفحهی php کدهای زیر را بگذارید و دکمهی پرینت را لینک بدهید به این فایل. به این صورت:

<a target=&quot_blank&quot href=&quotprint.php&quot>download pdf</a>

و درون فایل php:

$mpdf = new Mpdf();
$mpdf->WriteHTML('<h1>Hello world!</h1>');
$mpdf->Output();

با این کد صفحهی شما پس از باز شدن در مرورگر به صورت pdf شروع به دانلود شدن میکند و نام فایل pdf دانلود شده برابر با نام فایل php خواهد بود.

حالا شما قبل از ارسال به خروجی میتوانید پارامترهای بسیاری را برای فایل pdf خود تنظیم کنید.

$mpdf = new Mpdf([
    'mode' => 'utf-8', 
    'orientation' => 'P',
    'margin_left' => '10',
    'margin_right' => '5',
    'margin_top' => '3',
    'margin_bottom' => '0',
    'margin_header' => '0',
    'margin_footer' => '3'
]);

برای مشاهدهی تمام پارامترها این صفحه از داکیومنت را ببینید.

اگر فوتر و هدر را بخواهید جداگانه تعریف کنید میتوانید از این دستورات استفاده کنید:

$mpdf->SetHTMLHeader($header);
$mpdf->SetHTMLFooter($footer);

البته ساختن هدر و فوتر خیلی جزئیات و تواناییهای بیشتری دارد که برای اطلاع بیشتر میتوانید این لینک از داکیومنت را مشاهده کنید.

اگر از فایل css استفاده میکنید باید جداگانه آن را لود کنید. برای نمونه ما از دو فایل css استفاده کردیم:

$stylesheet1 = file_get_contents( 'style1.css');
$stylesheet2 = file_get_contents('style2.css');
$mpdf->WriteHTML($stylesheet1, 1);    // The parameter 1 tells that this is css/style only and no body/html/text
$mpdf->WriteHTML($stylesheet2, 1);

که شکل نهایی کد شما چیزی شبیه این خواهد شد:

'$mpdf = new Mpdf([
    'mode' => 'utf-8', 
        'orientation' => 'P',
        ]);
        $mpdf->WriteHTML('<h1>Hello world!</h1>');
        $mpdf->SetHTMLHeader('<h1>Header</h1>');    
        $mpdf->SetHTMLFooter('<h1>Footer</h1>');
        $mpdf->Output('name.pdf', 'D');        // نام دلخواه شما را به فایل میدهد و با پارامتر D آن را دانلود میکند

اگر خطا گرفتید این را قبل از output بگذارید:

ob_clean();
$mpdf->Output();

استفاده در فریمورک (برای نمونه لاراول)

در کنترلر مورد نظر این کدها را قرار میدهیم: (از پارامترهای اختیاری فاکتور گرفتم که زیاد اینجا شلوغ نشود و اصل مطلب گم نشود)

$mpdf = new Mpdf();
$mpdf->WriteHTML('some text or htm code');
$mpdf->Output('fileName.pdf'); 

میتوانیم یک متغیر که حاوی کدهای صفحهی ما هست را برای فانکشن WriteHTML ارسال کنیم:

$mpdf = new Mpdf();
 $html = '<p>$foo</p>
                <p>$bar</p>';
 $mpdf->WriteHTML($html);
 $mpdf->Output('fileNamee.pdf'); 

میتوانیم حتا یک view برای آن ارسال کنیم:

$mpdf = new Mpdf();
 $html = view('page')->with('foo', $foo);
 $mpdf->WriteHTML($html);
 $mpdf->Output('fileNamee.pdf'); 


فونت فارسی

و اما یکی از مهمترین مرحلههای کار، یعنی تنظیم فونت فارسی.

همهی فونتها را تست کردهام بهترین نتیجه را با فونت میترا و البته با همین دو فونتی که آپلود میکنم گرفتهام: (ممکن است شما هم در کامپیوتر خود میترا داشته باشید ولی باید استاندارد و سالم باشد پس اگر خروجی شما خراب است این نسخه از فونتها را حتمن تست کنید)

IRMitra.ttf

IRMitraBold.ttf

بعد از دانلود در این فولدر کپی کنید:

.../mpdf/mpdf/ttfonts

و در فایل زیر تغییرات زیر را اعمال کنید:


...\mpdf\mpdf\src\Config\FontVariables.php
-----------------------------------------------------------------------------------------
'fontdata' => [
&quotdejavusanscondensed&quot => [
   'R' => &quotDejaVuSansCondensed.ttf&quot,
   'B' => &quotDejaVuSansCondensed-Bold.ttf&quot,
   'I' => &quotDejaVuSansCondensed-Oblique.ttf&quot,
   'BI' => &quotDejaVuSansCondensed-BoldOblique.ttf&quot,
   'useOTL' => 0xFF,
   'useKashida' => 75,
],

//////////////////////////////////
.... // many lines until last array
/////////////////////////////////

// yo add this section
&quotmitra&quot => [
    'R' => &quotIRMitra.ttf&quot, //regular
    'B' => &quotIRMitraBold.ttf&quot, //bold
    'useOTL' => 0xFF,
    'useKashida' => 75,
],
// until here

حالا برای استفاده از فونت خود باید هنگام استایل دادن به صفحهی pdf فونت را به نام mitra به متن خود اعمال کنید. (در کد بالا کوتیشن ها درست نمایش داده نمی شود. ایراد از ویرگول است.)

یک لینک مفید در همین زمینه.


آپدیت ۱۲ خرداد ۱۴۰۳

یک بسته فونت استاندارد مناسب استفاده در این کتابخانه را از اینجا دانلود کنید

موفق باشید.