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

دسته بندی: لاراول
سطح مقاله: متوسط
زمان مطالعه: 18 دقیقه
۰۸ مهر ۱۳۹۹

یکی از بخش‌های مهم وب اپلیکیشن‌ها، گرفتن خروجی 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 لوکال هاست در دسترس است. با وارد کردن آدرس http://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\[email protected]');

ایجاد کنترلر

در 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'));
    }

}

با وارد کردن مسیر http://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 برای لاراول را با مثال‌های کاربردی فرا گرفتیم و تنظیمات متفاوت آن را نیز به طور اجمالی برای شما ذکر کردیم. امیدواریم که این مقاله مورد توجه و استقبال شما قرار گرفته باشد و توانسته باشد دانش شما را در زمینه فریم‌ورک محبوب لاراول ارتقا دهد.

اگر نظر یا سوالی دارید، خوشحال می‌شویم آن را در قسمت نظرات با ما و سایر کاربران سون لرن به اشتراک بگذارید.

اگر به یادگیری بیشتر لاراول علاقه داری می‌تونی در دوره آموزشی لاراول کاربردی (بسته پروژه محور) شرکت کنی، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژه‌ها به صورت کامل برنامه‌ نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.

چه امتیازی به این مقاله می دید؟
نویسنده رضا زیدی
از یادگیری ، عمل‌گرایی و چالش‌های مربوطه ، لذت می‌برم ...

نظرات کاربران

فریدون احمدی

با سلام من از این پکیج در پروژه م استفاده کردم و خیلی هم درگیر کانفیگش برای فارسی بودم اما متاسفانه نمایش نداد با متا تگ و ….. آیا از این پکیج برای فارسی اصلا نمیشه استفاده کرد؟ چون تو وبسایت هایی دیدم که عربی رو نوشته بود ممنون میشم راهنمایی کنید؟

رضا زیدی

سلام
نه متاسفانه برای فارسی ساپورت نمی‌کنه… یکسری راه حل‌ها در سطح وب هست که به نظر بنده زیاده از حد پیچیده‌ان و به جاش می‌تونید از پکیج laravel-mpdf استفاده کنید که فارسی رو هم ساپورت می‌کنه
اگر فرصت شد اون پکیج رو هم در مقاله‌ی جداگانه‌ای پوشش می‌دیم
ممنون از توجهتون

محمود خسروی

سلام

این pdf فارسی کار نمیکنه میخواستم مطلب برای ایجاد فارسی هم بزاری

ممنون

رضا زیدی

سلام
خواهش می‌کنم
بله با فارسی کار نمی‌کنه
برای فارسی هم می‌تونید از پکیج laravel-mpdf استفاده کنید
اگر فرصت شد حتما نحوه کار با اون پکیج رو هم خدمتتون آموزش می‌دیم
مرسی از توجهتون

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :