یکی از بخشهای مهم وب اپلیکیشنها، گرفتن خروجی Pdf است. ما به خروجی Pdf برای گرفتن لیست مشتریها، لیست پرداختیها، فاکتور و گزارشهای مشابه از دادهها نیاز داریم. پکیج DomPdf، بهترین پکیج موجود زبان Php (با بیش از 7300 ستاره و 1400 فورک در گیت هاب) برای تبدیل Html به Pdf است. بهترین پکیج Pdf برای لاراول نیز پکیج barryvdh/Laravel-pdfdom میباشد که در واقع از همان پکیج ذکر شده در Php برای لاراول استفاده میکند. با استفاده از آن، به راحتی میتوانید صفحهی Html خود را به خروجی Pdf در لاراول تبدیل کنید. در این مقاله از سری مقالات آموزش لاراول، از ابتدای نصب پروژه، قدم به قدم با شما همراه خواهیم بود تا با استفاده از بهترین پکیج Pdf برای لاراول، نحوهی ساخت Pdf در لاراول را فرا بگیرید و بتوانید خروجی Pdf را در پروژه لاراول دانلود یا ذخیره نمایید.
نیازمندیهای اولیه
برای شروع کار، حداقل به ورژن 7.1 از Php و دانش کافی در زمینهی لاراول نیاز دارید.
نصب لاراول
به پوشهی دلخواه خود بروید و دستور زیر را برای نصب لاراول اجرا کنید:
composer create-project --prefer-dist laravel/laravel blog
ابتدا با استفاده از Wamp یا Xampp، ماژول MySql را فعال و در PhpMyAdmin، دیتابیس مورد نظر خود را ایجاد کنید. سپس فایل env. را با توجه به مشخصات دیتابیس، بروزرسانی کنید:
پس از اجرای این دستور، پروژه بر روی پورت 8000 لوکال هاست در دسترس است. با وارد کردن آدرس https://localhost:8000 در نوار آدرس مرورگر، با این صفحه مواجه میشوید:
نصب پکیج
با استفاده از دستور زیر پکیج را نصب میکنیم:
composer require barryvdh/laravel-dompdf
سپس در فایل app.php در پوشهی config ،ServiceProvider را به آرایهی providers اضافه کنید:
Barryvdh\DomPDF\ServiceProvider::class,
می توانید از Facade برای کوتاهتر شدن کد خود استفاده کنید. برای این منظور، کد زیر را به آرایهی aliases اضافه کنید:
'PDF' => Barryvdh\DomPDF\Facade::class,
راهاندازی دیتابیس
در دایرکتوری پروژه با استفاده از دستور زیر جداول را ایجاد کنید:
php artisan migrate
افزودن کاربران تصادفی
با استفاده از دستور زیر، برای جدول کاربران یک Seeder ایجاد کنید:
php artisan make:seeder UsersTableSeeder
فایل مربوطه در مسیر database/seeds ایجاد میشود. میخواهیم تعداد 10 کاربر تصادفی را ایجاد کنیم، پس برای این منظور در فایل UsersTableSeeder.php کد زیر را وارد کنید:
<?php
use App\User;
use Illuminate\Database\Seeder;
class UsersTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
factory(User::class, 10)->create();
}
}
سپس در فایل DatabaseSeeder.php در همان پوشه کد زیر را وارد کنید:
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$this->call(UsersTableSeeder::class);
}
}
سپس دستور زیر را اجرا کنید:
php artisan db:seed
ایجاد فایلهای Html
فایل نمایش لیست کاربران را در مسیر resources/views/admin/users با نام index.blade.php ایجاد کنید:
سپس در کنترلر ایجاد شده در مسیر app/Http/Controllers/Admin، کد زیر را برای نمایش لیست کاربران و گرفتن خروجی Pdf از آن، وارد کنید:
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use PDF;
use Illuminate\Http\Request;
use App\User;
class UsersController extends Controller
{
public function index(Request $request)
{
$users = User::all();
if ($request->has('type')) {
if ($request->get('type') == 'pdf') {
$pdfFile = PDF::loadView('admin.users.users-pdf', compact('users'));
return $pdfFile->download('users-list.pdf');
}
}
return view('admin.users.index', compact('users'));
}
}
و با کلیک بر روی دکمهی Export to PDF میتوانید خروجی Pdf خود را دانلود کنید.
با تغییر استایلهای Css مربوط به فایل Html، میتوانید ظاهر فایل Pdf را به هر شکلی که میخواهید، تغییر دهید.
اگر نمیخواهید از Facade استفاده کنید، میتوانید کد زیر را به کار ببرید:
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\App;
use PDF;
use Illuminate\Http\Request;
use App\User;
class UsersController extends Controller
{
public function index(Request $request)
{
$users = User::all();
if ($request->has('type')) {
if ($request->get('type') == 'pdf') {
$pdfFile = App::make('dompdf.wrapper');
$pdfFile->loadView('admin.users.users-pdf', compact('users'));
return $pdfFile->stream();
}
}
return view('admin.users.index', compact('users'));
}
}
میتوانید کدهای Html را مستقیما در کنترلر وارد کنید:
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use PDF;
use Illuminate\Http\Request;
use App\User;
class UsersController extends Controller
{
public function index(Request $request)
{
$users = User::all();
if ($request->has('type')) {
if ($request->get('type') == 'pdf') {
$pdfFile = PDF::loadHTML('<h1>Hello World!</h1>');
return $pdfFile->download('users-list.pdf');
}
}
return view('admin.users.index', compact('users'));
}
}
میتوانید سایز و جهت (landscape یا portrait) برگهی خروجی را نیز تنظیم کنید:
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use PDF;
use Illuminate\Http\Request;
use App\User;
class UsersController extends Controller
{
public function index(Request $request)
{
$users = User::all();
if ($request->has('type')) {
if ($request->get('type') == 'pdf') {
$pdfFile = PDF::loadHTML('<h1>Hello World!</h1>');
$pdfFile->setPaper('A3', 'landscape');
return $pdfFile->download('users-list.pdf');
}
}
return view('admin.users.index', compact('users'));
}
}
که در نهایت خروجی Pdf مطابق زیر خواهد بود:
میتوانید فایلهای Html را قبل از دانلود، از مسیر دلخواه گرفته و به صورت Pdf ذخیره کنید:
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use PDF;
use Illuminate\Http\Request;
use App\User;
class UsersController extends Controller
{
public function index(Request $request)
{
$users = User::all();
if ($request->has('type')) {
if ($request->get('type') == 'pdf') {
$pdfFile = PDF::loadFile( public_path() . '/sample.html' );
$pdfFile->save( public_path() . '/sample.pdf' );
return $pdfFile->stream('users-list.pdf');
}
}
return view('admin.users.index', compact('users'));
}
}
میتوانید متدها را به صورت زنجیرهای هم فراخوانی کنید:
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use PDF;
use Illuminate\Http\Request;
use App\User;
class UsersController extends Controller
{
public function index(Request $request)
{
$users = User::all();
if ($request->has('type')) {
if ($request->get('type') == 'pdf') {
return PDF::loadFile( public_path() . '/sample.html' )->save( public_path()
. '/sample.pdf' )->stream('users-list.pdf');
}
}
return view('admin.users.index', compact('users'));
}
}
به طور پیشفرض، در حالتی که Debug فعال است (در فایل env.)، Errorها در خروجی Pdf نمایش داده میشوند. برای غیرفعال کردن نمایش Errorها میتوانید کد زیر را به کار ببرید:
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use PDF;
use Illuminate\Http\Request;
use App\User;
class UsersController extends Controller
{
public function index(Request $request)
{
$users = User::all();
if ($request->has('type')) {
if ($request->get('type') == 'pdf') {
$pdfFile = PDF::loadView('admin.users.users-pdf', compact('users'));
$pdfFile->setWarnings(false);
return $pdfFile->download('users-list.pdf');
}
}
return view('admin.users.index', compact('users'));
}
}
تنظیمات
در این پکیج تنظیمات متنوعی وجود دارد که برای دسترسی به آنها میتوانید فایل پیکربندی آن را با دستور زیر ایجاد کنید:
هم چنین میتوانید با استفاده از دو ویژگی Css یعنی page-break-before و page-break-after صفحه بندی برگههای خروجی را مدیریت کنید:
.page-break {
page-break-after: always;
}
منابع تکمیلی
برای بررسی و مشادهی کد منبع پکیج میتوانید به ریپازیتوری گیت هاب پکیج مراجعه کنید.
جمعبندی
در مقالهی فوق از سری آموزش لاراول، به طور کامل و جامع با نحوهی ساخت Pdf در لاراول آشنا شدیم و توانستیم خروجی Pdf را در لاراول دانلود و ذخیره کنیم. برای این منظور بهترین پکیج Pdf برای لاراول را با مثالهای کاربردی فرا گرفتیم و تنظیمات متفاوت آن را نیز به طور اجمالی برای شما ذکر کردیم. امیدواریم که این مقاله مورد توجه و استقبال شما قرار گرفته باشد و توانسته باشد دانش شما را در زمینه فریمورک محبوب لاراول ارتقا دهد.
اگر نظر یا سوالی دارید، خوشحال میشویم آن را در قسمت نظرات با ما و سایر کاربران سون لرن به اشتراک بگذارید.
اگر به یادگیری بیشتر لاراول علاقه داری میتوانی در دوره آموزش لاراول کاربردی (بسته پروژه محور) شرکت کنی، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژهها به صورت کامل برنامه نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.
۱۰ دیدگاه
علی۲۲ شهریور ۱۴۰۰، ۰۴:۴۷
سلام
من تو پنل ادمین سایدبار دارم و هدینگ پنل و قسمت سمت چپ لیست کاربران
راهی هست فقط از اون قسمت کاربران خروجی pdf بگیره ؟ سایدبارو هدر نیوفته؟
نازنین کریمی مقدم۲۳ شهریور ۱۴۰۰، ۱۱:۱۴
درود
برای اینکار باید تنها اطلاعات کاربران رو به pdf بفرستید. برای مثال میتونید بخش download pdf in laravel رو از <a href="https://www.positronx.io/laravel-pdf-tutorial-generate-pdf-with-dompdf-in-laravel/" target="_blank" rel="noopener nofollow ugc">این صفحه</a> مطالعه کنید.
M.javad Rezvani۱۶ آذر ۱۳۹۹، ۱۴:۲۴
این ارور برای چیه؟؟
[code]
Non-static method Barryvdh\DomPDF\PDF::loadView() should not be called statically
[/code]
رضا زیدی۲۰ آذر ۱۳۹۹، ۰۷:۵۸
به این دلیله که از namespace اشتباه یعنی Barryvdh\DomPDF\PDF به عنوان Facade استفاده کردید
به جای اون از namespace زیر استفاده کنید:
<code>;use Barryvdh\DomPDF\Facade as PDF</code>
فریدون احمدی۱۱ مهر ۱۳۹۹، ۰۹:۵۷
با سلام من از این پکیج در پروژه م استفاده کردم و خیلی هم درگیر کانفیگش برای فارسی بودم اما متاسفانه نمایش نداد با متا تگ و ..... آیا از این پکیج برای فارسی اصلا نمیشه استفاده کرد؟ چون تو وبسایت هایی دیدم که عربی رو نوشته بود ممنون میشم راهنمایی کنید؟
رضا زیدی۱۲ مهر ۱۳۹۹، ۲۰:۰۸
سلام
نه متاسفانه برای فارسی ساپورت نمیکنه... یکسری راه حلها در سطح وب هست که به نظر بنده زیاده از حد پیچیدهان و به جاش میتونید از پکیج <a href="https://github.com/mccarlosen/laravel-mpdf" target="_blank" rel="noopener noreferrer nofollow ugc">laravel-mpdf</a> استفاده کنید که فارسی رو هم ساپورت میکنه
اگر فرصت شد اون پکیج رو هم در مقالهی جداگانهای پوشش میدیم
ممنون از توجهتون
محمود خسروی۰۸ مهر ۱۳۹۹، ۲۱:۲۳
سلام
این pdf فارسی کار نمیکنه میخواستم مطلب برای ایجاد فارسی هم بزاری
ممنون
رضا زیدی۰۹ مهر ۱۳۹۹، ۱۹:۴۴
سلام
خواهش میکنم
بله با فارسی کار نمیکنه
برای فارسی هم میتونید از پکیج <a href="https://github.com/mccarlosen/laravel-mpdf" target="_blank" rel="noopener noreferrer nofollow ugc">laravel-mpdf</a> استفاده کنید
اگر فرصت شد حتما نحوه کار با اون پکیج رو هم خدمتتون آموزش میدیم
مرسی از توجهتون
۰۸ اسفند ۱۴۰۰، ۲۲:۲۶
آقای عزیر دل برادر اگر امکان دارد آموززش ساخت pdf با زبان شیرین فارسی هم بدی ممنون میشم اگر این مطلاب منو بخونید.
نازنین کریمی مقدم۰۹ اسفند ۱۴۰۰، ۱۰:۲۵
درود
در حال حاضر مشغول آپدیت مقالات قدیمی هستیم و امکان نگارش و آپلود مقالات جدید رو نداریم. اما میتونید از پکیجی که قبلا آقای زیدی معرفی کردند استفاده کنید.
برنامه نویسی صبر و تلاش میخواد و اگر میبینید اینجا رو یه مورد آموزش نذاشتیم، باید خودتون سرچ بزنید و آموزشهای انگلیسی رو استفاده کنید.