۱۰ دیدگاه نظر رضا زیدی
خروجی pdf در لاراول
خروجی pdf در لاراول

یکی از بخش‌های مهم وب اپلیکیشن‌ها، گرفتن خروجی 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 در نوار آدرس مرورگر، با این صفحه مواجه می‌شوید:

خروجی pdf در لاراول

نصب پکیج

با استفاده از دستور زیر پکیج را نصب می‌کنیم:
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 در نوار آدرس مرورگر خود به لیست کاربران دسترسی پیدا می‌کنید:

خروجی pdf در لاراول

و با کلیک بر روی دکمه‌ی Export to PDF می‌توانید خروجی Pdf خود را دانلود کنید.

با تغییر استایل‌های Css مربوط به فایل Html، می‌توانید ظاهر فایل Pdf را به هر شکلی که می‌خواهید، تغییر دهید.

آموزش 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 مطابق زیر خواهد بود: خروجی 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 بگیره ؟ سایدبارو هدر نیوفته؟

نازنین کریمی مقدم ۲۳ شهریور ۱۴۰۰، ۱۱:۱۴

درود برای اینکار باید تنها اطلاعات کاربران رو به 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 با زبان شیرین فارسی هم بدی ممنون میشم اگر این مطلاب منو بخونید.

نازنین کریمی مقدم ۰۹ اسفند ۱۴۰۰، ۱۰:۲۵

درود در حال حاضر مشغول آپدیت مقالات قدیمی هستیم و امکان نگارش و آپلود مقالات جدید رو نداریم. اما میتونید از پکیجی که قبلا آقای زیدی معرفی کردند استفاده کنید. برنامه نویسی صبر و تلاش میخواد و اگر میبینید اینجا رو یه مورد آموزش نذاشتیم، باید خودتون سرچ بزنید و آموزشهای انگلیسی رو استفاده کنید.

  • نیازمندی‌های اولیه
  • نصب پکیج
  • راه‌اندازی دیتابیس
  • ایجاد فایل‌های‌ Html
  • تعریف مسیر
  • ایجاد کنترلر
  • تنظیمات
  • نکات
  • منابع تکمیلی
اشتراک گذاری مقاله در :