PHP Developer
لاراول Pdf ، کاراکتر فارسی دغدغه نیست !
چند وقت پیش طی یک پروژه میخواستم از لاراول خروجی pdf تهیه کنم که یه سری ویژگی ها داشته باشه :
- حتما کاراکتر های فارسی رو ساپورت کنه .
- امکاناتی مثل شماره صفحه page number ، بریدن صفحه و رفتن به صفحه بعد page break و ... .
- پیاده سازی ظاهر اون سخت نباشه . راحت با Html , CSS بشه اوکیش کرد .
- ابعاد صفحه ی pdf و orientation اون قابل تنظیم باشه ( مثلا برای بارکد های محصولات و قطعات )
- و بتونم توش از blade استفاده کنم و بهش دیتا پاس بدم و ... .
اولین پکیجی که بهش رسیدم barryvdh/laravel-dompdf بود که خب نویسنده ی بنام و قوی ای داره اما بعد از استفاده از اون به مشکل کاراکتر های فارسی و ... خوردم که در کل بهتون پیشنهاد نمیکنم .
پیشنهاد من :
بنظر من بهترین پکیج میتونه 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 بگیرید و به مشکل خوردید پست قبلی من رو بخونید :
امیدوارم دیگه دغدغه ی کاراکتر های فارسی توی خروجی هاتون نداشته باشید :)
مطلبی دیگر از این انتشارات
مفهوم مدیریت وابستگی در لاراول یکبار برای همیشه!
مطلبی دیگر از این انتشارات
مدیریت حرفه ای فایل ها و تصاویر با پکیج medialibrary در لاراول
مطلبی دیگر از این انتشارات
مقایسه Laravel vs Django... از دید یه لاراول کار که تازه رفته جنگو! بخش اول