یکی از بخش های مهم وب اپلیکیشن ها، گرفتن خروجی 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
ایجاد فایل های Html
فایل نمایش لیست کاربران را در مسیر 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 برای لاراول را با مثال های کاربردی فرا گرفتیم و تنظیمات متفاوت آن را نیز به طور اجمالی برای شما ذکر کردیم. امیدواریم که این مقاله مورد توجه و استقبال شما قرار گرفته باشد و توانسته باشد دانش شما را در زمینه فریم ورک محبوب لاراول ارتقا دهد.
اگر نظر یا سوالی دارید، خوشحال می شویم آن را در قسمت نظرات با ما و سایر کاربران سون لرن به اشتراک بگذارید.
اگر به یادگیری بیشتر لاراول علاقه داری می توانی در دوره آموزش لاراول کاربردی (بسته پروژه محور) شرکت کنی، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژه ها به صورت کامل برنامه نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.
سلام
این pdf فارسی کار نمیکنه میخواستم مطلب برای ایجاد فارسی هم بزاری
ممنون
سلام
خواهش میکنم
بله با فارسی کار نمیکنه
برای فارسی هم میتونید از پکیج laravel-mpdf استفاده کنید
اگر فرصت شد حتما نحوه کار با اون پکیج رو هم خدمتتون آموزش میدیم
مرسی از توجهتون
آقای عزیر دل برادر اگر امکان دارد آموززش ساخت pdf با زبان شیرین فارسی هم بدی ممنون میشم اگر این مطلاب منو بخونید.
با سلام من از این پکیج در پروژه م استفاده کردم و خیلی هم درگیر کانفیگش برای فارسی بودم اما متاسفانه نمایش نداد با متا تگ و ..... آیا از این پکیج برای فارسی اصلا نمیشه استفاده کرد؟ چون تو وبسایت هایی دیدم که عربی رو نوشته بود ممنون میشم راهنمایی کنید؟
سلام
نه متاسفانه برای فارسی ساپورت نمیکنه... یکسری راه حلها در سطح وب هست که به نظر بنده زیاده از حد پیچیدهان و به جاش میتونید از پکیج laravel-mpdf استفاده کنید که فارسی رو هم ساپورت میکنه
اگر فرصت شد اون پکیج رو هم در مقالهی جداگانهای پوشش میدیم
ممنون از توجهتون
این ارور برای چیه؟؟
[code]
Non-static method Barryvdh\DomPDF\PDF::loadView() should not be called statically
[/code]
به این دلیله که از namespace اشتباه یعنی Barryvdh\DomPDF\PDF به عنوان Facade استفاده کردید
به جای اون از namespace زیر استفاده کنید:
;use Barryvdh\DomPDF\Facade as PDF
سلام
من تو پنل ادمین سایدبار دارم و هدینگ پنل و قسمت سمت چپ لیست کاربران
راهی هست فقط از اون قسمت کاربران خروجی pdf بگیره ؟ سایدبارو هدر نیوفته؟
درود
برای اینکار باید تنها اطلاعات کاربران رو به pdf بفرستید. برای مثال میتونید بخش download pdf in laravel رو از این صفحه مطالعه کنید.