لاراول Pdf ، کاراکتر فارسی دغدغه نیست !

چند وقت پیش طی یک پروژه میخواستم از لاراول خروجی pdf تهیه کنم که یه سری ویژگی ها داشته باشه :

  • حتما کاراکتر های فارسی رو ساپورت کنه .
  • امکاناتی مثل شماره صفحه page number ،‌ بریدن صفحه و رفتن به صفحه بعد page break و ... .
  • پیاده سازی ظاهر اون سخت نباشه . راحت با Html , CSS بشه اوکیش کرد .
  • ابعاد صفحه ی pdf و orientation اون قابل تنظیم باشه ( مثلا برای بارکد های محصولات و قطعات )
  • و بتونم توش از blade استفاده کنم و بهش دیتا پاس بدم و ... .
اولین پکیجی که بهش رسیدم barryvdh/laravel-dompdf بود که خب نویسنده ی بنام و قوی ای داره اما بعد از استفاده از اون به مشکل کاراکتر های فارسی و ... خوردم که در کل بهتون پیشنهاد نمیکنم .

پیشنهاد من :

بنظر من بهترین پکیج میتونه niklasravnsborg/laravel-pdf باشه که به فکر کاراکترهای پیچیده فارسی و عربی و ... هم بوده و امکاناتی که بالا گفتم رو هم داره .

https://github.com/niklasravnsborg/laravel-pdf
این پکیج با کمک mpdf ساخته شده . بعضی از attribute ها و دستورات css رو ممکنه نتونه بفهمه و توی خروجیتون به مشکل بخورید پس راهنمای اون رو هم یه مطالعه داشته باشید بد نیست . ولی بطور خلاصه بخوام بگم بهتره از فریمورک هایی مثل bootstrap و ... استفاده نکنید .

پکیج رو که نصب کنید طبق راهنما باید توی فایل کانفیگش آدرس فونت های فارسیتون رو بدید و به اون ها اسم بدید . یعنی کاری به css و فونت های اون نداره و باید توی کانفیگ هم اسم و هم آدرس فونت هاتون رو بدید . به عنوان مثال :

return [
   'mode'                  => 'utf-8',
   'format'                => 'A4',
   'author'                => 'Farid',
   'subject'               => '',
   'keywords'              => '',
   'creator'               => 'Farid',
   'display_mode'          => 'fullpage',
   'tempDir'               => base_path('../temp/'),
   'font_path' => base_path('public/fonts/'),
   'font_data' => [
      'fa' => [
         'R'  => 'fonts/ttf/IRANSansWeb(FaNum).ttf',
         'B'  => 'fonts/ttf/IRANSansWeb(FaNum)_Bold.ttf',
         'useOTL' => 0xFF,
         'useKashida' => 75,
      ],
      'en' => [
         'R'  => 'Gothic/Century Gothic.ttf',
         'B'  => 'Gothic/GOTHICB.ttf',
      ]
   ]
];

طبق کانفیگ بالا توی فایل های view blade که برای خروجی گرفتن میسازید باید توی cssتون اسم فونت رو 'fa' یا 'en' بزارید تا مشکلی پیش نیاد .

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

<style>
    @page {
        header: page-header;
        footer: page-footer;
    }
</style>
// for header :
<htmlpageheader name="page-header">
    This is Header
</htmlpageheader>

برخی امکانات :

برای نمایش شماره ی صفحه ای که داخلش هستید میتونید از {PAGENO} استفاده کنید و تعداد کل صفحاتتون {nb} هست . برای کات کردن صفحه و رفتن به صفحه ی بعد میتونید از تگ <pagebreak></pagebreak> استفاده کنید . نحوه ی فراخوانی توی controller یا job ها هم خیلی سادست یه مثالی میزنم که اکثر نیاز ها رو شامل بشه :

use niklasravnsborg\LaravelPdf\PdfWrapper;
$pdf = new PdfWrapper();
$pdf->loadView('YOUR_BLADE_FILE',compact('YOUR_DATA'),[],[
    'mode' => 'utf-8', 'format' => [WIDTH,HEIGHT]
])->save('ADDRESS/FILE_NAME.pdf');

اگر توی job خواستید خروجی pdf بگیرید و به مشکل خوردید پست قبلی من رو بخونید :

https://virgool.io/@faridfroozan/%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-queue-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1-%D8%B1%D9%88-%D9%85%D8%B9%D8%B7%D9%84-%D9%86%DA%A9%D9%86-tg2ubzbzvgye
امیدوارم دیگه دغدغه ی کاراکتر های فارسی توی خروجی هاتون نداشته باشید :)