درود خدمت دوستان عزیز.
کار با pdf در لاراول برای فونت فارسی خیلی وقت ها با دردسرهای زیادی همراه میشه و سردرگمی هایی برای بعضی ها ممکنه داشته. البته خودمم توی این زمینه دردسرهای زیادی رو کشیدم و تا حدود یکی دو روز با پکیج های مختلفی کار کردم تا بتونم به خروجی مطلوب برسم.
در یکی ازپروژه ها نیاز بود که کاربر نتیجه ی تست هاشو به صورت pdf دانلود کنه که من توی پیدا کردن پکیج مناسب برای این کار یکم سردرگم شدم توی سایت های داخلی که دنبالش گشتم چند تا پکیج گفته شده بود که بعضی ها اصلا بروز نشده بودن و در نسخه های قبلی لاراول قابلیت استفاده بودند.
اما یکی از پکیج هایی که من باهاش کارمو راه انداختم پکیج:
mpdf/mpdf
بود که راحت با فارسی جفت و جور شد. البته این ابتدای ماجرا بود تا اینکه خواستم فونت فارسی رو بهش اضافه کنم.
در این زمینه فونت خاصی از طرف کارفرما مشخص نشده بود و من در انتخاب فونت آزاد بودم. نمیدونم از کجا به ذهنم خطور کرد که فونت B Nazanin رو استفاده کنم.
طبق اصولی که توی مستندات پکیج گفته شده فونت رو اضافه کردم ولی نشد. روش های مختلفی رو از سایت های مختلفی برای این پکیج استفاده کردم اما انگار قسم خورده بود کار نکنه. یا کلا فونت اعمال نمیشد یا وقتی اعمال میشد صفحات به هم میریخت یا کلا سفید میشد.
تا اینکه به ذهنم خطور کرد که آقا چه کاریه گیر دادی به این فونت یه فونت دیگرو امتحان کن شاید مشکل از فونت باشه که پکیج باهاش سازگاری نداره و اینطوری شدکه با اولین تغییر به فونت جدید مشکل حل و فونت در pdf اعمال شد به همین سادگی نحوه ی پیاده سازیش رو هم در پایین میارم:
1- اول اینکه باید فایل های فونت هارو در یک فولدر در پوشه ی public بذارین مثال:
2- سپس فقط کافیه ادرس و مشخصات اون فایل ها رو به صورت دقیق در هنگام ساخت pdf اعمال کنید:
$user = User::findOrFail($id);
$html = view('pages.dashboard.psychological-testing.pdf', compact('user'))->render();
$defaultConfig = (new ConfigVariables())->getDefaults();
$fontDirs = $defaultConfig['fontDir'];
$defaultFontConfig = (new FontVariables())->getDefaults();
$fontData = $defaultFontConfig['fontdata'];
$mpdf = new \Mpdf\Mpdf(
[
'tempDir' => storage_path('fonts'),
'fontDir' => array_merge($fontDirs, [
public_path('/fonts/roya/')
]),
'fontdata' => $fontData + [
'roya' => [
'R' => 'roya.ttf',
'B' => 'royabold.ttf',
'useOTL' => 0xFF,
'useKashida' => 75,
],
],
'default_font' => 'roya'
]);
// Write the HTML content to the PDF
$mpdf->WriteHTML($html);
// Output the PDF as a download
return $mpdf->Output("$user->full_name.pdf", 'D');
که در کد بالا پوشه مربوطه رو با استفاده از کد زیر به پکیح میدیم.
'fontDir' => array_merge($fontDirs, [
public_path('/fonts/roya/')
]),
سپس با استفاده از کد زیر فونت رو مشخص میکنیم:
'fontdata' => $fontData + [
'roya' => [
'R' => 'roya.ttf',
'B' => 'royabold.ttf',
'useOTL' => 0xFF,
'useKashida' => 75,
],
],
'default_font' => 'roya'
امیدوارم این نوشته به کارتون بیاد و بتونید ازش استفاده ای ببرید.
با آرزوی بهترین ها.