یکی از بخشهای مهم وب اپلیکیشنها، گرفتن خروجی 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. را با توجه به مشخصات دیتابیس، بروزرسانی کنید:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=pdf
DB_USERNAME=root
DB_PASSWORD=
حال با دستور زیر میتوانید پروژه را اجرا کنید:
php artisan serve
پس از اجرای این دستور، پروژه بر روی پورت 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
فایل نمایش لیست کاربران را در مسیر resources/views/admin/users با نام index.blade.php ایجاد کنید:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Users List</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
</head>
<body>
<div class="container mt-5">
<div class="d-flex justify-content-between mb-2">
<p><strong>Users List</strong></p>
<a class="btn btn-success" href="{{ url('admin/users?type=pdf') }}">Export to PDF</a>
</div>
<table class="table table-bordered mb-5">
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">Email</th>
<th scope="col">Registration Date</th>
</tr>
</thead>
<tbody>
@foreach($users as $user)
<tr>
<td>{{ $user->name }}</td>
<td>{{ $user->email }}</td>
<td>{{ $user->created_at }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</body>
</html>
سپس فایل خروجی Pdf را در همان مسیر قبلی و با نام users-pdf.blade.php ایجاد کنید:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>7learn Laravel PDF</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
</head>
<body>
<h2 class="mb-3">Users List</h2>
<table class="table table-bordered">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Registration Date</th>
</tr>
</thead>
<tbody>
@foreach ($users as $user)
<tr>
<td>{{ $user->name }}</td>
<td>{{ $user->email }}</td>
<td>{{ $user->created_at }}</td>
</tr>
@endforeach
</tbody>
</table>
</body>
</html>
در فایل web.php در پوشهی routes دستور زیر را اجرا کنید:
Route::get('admin/users','Admin\UsersController@index');
در Terminal دستور زیر را اجرا کنید:
php artisan make:controller Admin/UsersController
سپس در کنترلر ایجاد شده در مسیر 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'));
}
}
با وارد کردن مسیر https://localhost:8000/admin/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'));
}
}
در این پکیج تنظیمات متنوعی وجود دارد که برای دسترسی به آنها میتوانید فایل پیکربندی آن را با دستور زیر ایجاد کنید:
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"
این فایل در پوشهی config و با نام dompdf.php ایجاد میشود.
همچنین میتوان این تنظیمات را در کنترلر و پیش از ایجاد فایل 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::setOptions(['dpi' => 96, 'defaultFont' => 'sans-serif']);
$pdfFile->loadView('admin.users.users-pdf', compact('users'));
$pdfFile->setWarnings(false);
return $pdfFile->download('users-list.pdf');
}
}
return view('admin.users.index', compact('users'));
}
}
این تنظیمات و مقدار پیشفرضشان به طور خلاصه در زیر لیست شدهاند:
"rootDir : "{app_directory}/vendor/dompdf/dompdf
(tempDir : "/tmp" (available in config/dompdf.php
"/fontDir : "{app_directory}/storage/fonts
"/fontCache : "{app_directory}/storage/fonts
"{chroot : "{app_directory
"logOutputFile : "/tmp/log.htm
"defaultMediaType : "screen
"defaultPaperSize : "a4
"defaultFont : "serif
dpi : 96
fontHeightRatio : 1.1
isPhpEnabled : false
isRemoteEnabled : true
isJavascriptEnabled : true
isHtml5ParserEnabled : false
isFontSubsettingEnabled : false
debugPng : false
debugKeepTemp : false
debugCss: false
debugLayout : false
debugLayoutLines : true
debugLayoutBlocks : true
debugLayoutInline : true
debugLayoutPaddingBox : true
"pdfBackend : "CPDF
"" : pdflibLicense
"adminUsername : "user
"adminPassword : "password
در قالب خروجی Pdf، متا تگ UTF-8 را ست کنید:
<meta charset="utf-8">
هم چنین میتوانید با استفاده از دو ویژگی Css یعنی page-break-before و page-break-after صفحه بندی برگههای خروجی را مدیریت کنید:
.page-break {
page-break-after: always;
}
برای بررسی و مشادهی کد منبع پکیج میتوانید به ریپازیتوری گیت هاب پکیج مراجعه کنید.
جمعبندی
در مقالهی فوق از سری آموزش لاراول، به طور کامل و جامع با نحوهی ساخت Pdf در لاراول آشنا شدیم و توانستیم خروجی Pdf را در لاراول دانلود و ذخیره کنیم. برای این منظور بهترین پکیج Pdf برای لاراول را با مثالهای کاربردی فرا گرفتیم و تنظیمات متفاوت آن را نیز به طور اجمالی برای شما ذکر کردیم. امیدواریم که این مقاله مورد توجه و استقبال شما قرار گرفته باشد و توانسته باشد دانش شما را در زمینه فریمورک محبوب لاراول ارتقا دهد.
اگر نظر یا سوالی دارید، خوشحال میشویم آن را در قسمت نظرات با ما و سایر کاربران سون لرن به اشتراک بگذارید.
اگر به یادگیری بیشتر لاراول علاقه داری میتوانی در دوره آموزش لاراول کاربردی (بسته پروژه محور) شرکت کنی، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژهها به صورت کامل برنامه نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.
;use Barryvdh\DomPDF\Facade as PDF
من تو پنل ادمین سایدبار دارم و هدینگ پنل و قسمت سمت چپ لیست کاربران
راهی هست فقط از اون قسمت کاربران خروجی pdf بگیره ؟ سایدبارو هدر نیوفته؟
برای اینکار باید تنها اطلاعات کاربران رو به pdf بفرستید. برای مثال میتونید بخش download pdf in laravel رو از این صفحه مطالعه کنید.