January 3, 2024

Viiisit [PHP] - TCPDF Library in Laravel!

#laravel#php#tcpdf

前言

總覺得跟 pdf 功能十分有緣分,先前在製作 READMEE 的專案時,有運用到 jspdf 這個前端的 pdf 套件,這次在工作上要使用後端的方式來處理,這次要來介紹 TCPDF!

TCPDF 簡介

TCPDF 是一個用於生成 PDF 文件的免費且開源的 PHP 類別,而且也是唯一基於 PHP 的函式庫並完全支援 UTF-8 Unicode 和從右到左的語言。在 2009 年,TCPDF 是 SourceForge 上超過 200,000 個項目中最活躍的之一(於 2010 年 4 月 3 日排名第 6)。

特色

在使用上,TCPDF 能夠在 PHP 應用程式中生成高度自定義和具有豐富內容的 PDF 文件,而無需依賴外部的程式庫,像是:


TCPDF 安裝

在使用之前,要先來安裝 TCPDF 到應用程式裡,這次在 GitHub 找到以 TCPDF 為基底的 open source: elibyy/tcpdf-laravel

可以透過 packagist 找自己想要的 package,先前有找到 dompdf 但是實作起來發現支援中文字體的功能稍嫌不足,找了很多辦法始終沒有效果,因此轉往 TCPDF 來實作!

透過 composer 來安裝 elibyy/tcpdf-laravel 套件

可以透過兩種方式:

  1. 在 terminal 輸入以下指令:
    composer require elibyy/tcpdf-laravel

  2. composer.json 的 require 裡寫下,"elibyy/tcpdf-laravel": "^9.0"

    要記得 JSON 格式要寫對

    1
    2
    3
    4
    5
    {
    "require": {
    "elibyy/tcpdf-laravel": "^9.0"
    }
    }

TCPDF 引入與使用

安裝完成後,就要來實際寫進 app 裡囉!

建立 Route

在 /routes 資料夾的 web.php 新增一條路徑。

1
2
3
4
5
...
use App\Http\Controllers\PDFController;

Route::get('pdf', [PDFController::class,'index']);
...

建立 Controller

在 Laravel 裡,要傳遞資料給 blade 來渲染畫面,就要建立 Controller 去傳遞!
因此,建立 Controller 來引入 TCPDF 功能並使用:

在 terminal 輸入以下指令:
php artisan make:controller PDFController

指令會在 app/Http/Controllers 資料夾裡出現 PDFController,並在裡頭寫下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php

namespace App\Http\Controllers;

use Elibyy\TCPDF\Facades\TCPDF;

class PDFController extends Controller
{
public function index()
{
$filename = 'sample.pdf';

$data = [
'title' => 'To Create PDF Files Using TCPDF Library'
];

$html = view()->make('pdf', $data)->render();

$pdf = new TCPDF;

$pdf::SetTitle('Generate PDF Using Laravel Library');
$pdf::AddPage();
$pdf::writeHTML($html, true, false, true, false, '');

$pdf::Output(public_path($filename), 'F');

return response()->download(public_path($filename));
}
}

如果有使用 Livewire 作為 Controller 的話,要注意 line 25-27 方法要改為:

1
2
3
4
return response()->streamDownload(
fn () => $pdf::Output(public_path($filename), 'F'),
$filename
);

建立 Blade

接著,在 /resources/views 資料夾建立一個 pdf.blade.php,用以呈現 pdf 的畫面。

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>

<head>
<title>To Create PDF Files Using TCPDF Library</title>
</head>

<body>
<h1 style="color:blue;">{!! $title !!}</h1>
</body>

</html>

以上設定完成之後,就可以在 terminal 輸入:php artisan serve 開啟 server,
當你連到 http://127.0.0.1:8000/pdf 路徑時,就會自動下載一份名為 sample.pdf 的檔案!


TCPDF 常見方法與參數說明

建立新的 PDF 物件

$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

  1. PDF_PAGE_ORIENTATION 用於設置頁面方向的參數。通常,可以使用 P(直向)或 L(橫向),空值則自動判斷,預設為 P(直向)。

  2. PDF_UNIT 用於設置頁面單位。在 PDF 中,頁面的大小和位置可以使用不同的單位來測量,例如,pt、mm(預設)、cm、in 等。

  3. PDF_PAGE_FORMAT 用於設置頁面格式的參數。通常是一個字串,指定了頁面的標準大小,如 A4(預設)、Letter 等。例如,PDF_PAGE_FORMAT = 'A4' 將設置頁面格式為 A4 大小。

  4. true 用於啟用或禁用自動頁面設置。當設置為 true 時,TCPDF 將自動調整頁面大小以適應內容。

  5. 'UTF-8' 用於設置文本編碼。UTF-8 是一種廣泛使用的字符編碼,支持多種語言。

  6. false 用於指定是否使用純文本模式。如果設置為 true,則 PDF 將以純文本模式創建。

常見方法

以下透過建立好的 $pdf 來以實例方法調用 TCPDF Library:

TCPDF::setPrintHeader( $val = true ) / TCPDF::setPrintFooter( $val = true )

TCPDF::SetFont( $family, $style = ‘’, $size = null, $fontfile = ‘’, $subset = ‘default’, $out = true )

TCPDF::SetAutoPageBreak( $auto, $margin )

TCPDF::AddPage( $orientation = ‘’, $format = ‘’, $keepmargins = false, $tocpage = false )

TCPDF::writeHTML( $html, $ln = true, $fill = false, $reseth = false, $cell = false, $align = ‘’ )

TCPDF::Output( $name = ‘doc.pdf’, $dest = ‘I’ )


TCPDF 設定排版方法



TCPDF 還有很多可以設定的方式,仔細去看發現整體的方法真的有很多種也有支援的中文字型真的友善許多!可以透過 Dev Resources - TCPDF methods 去查找方法,如果看 TCPDF 的原始文件真的會看到心很累哈哈哈,以上就是這次工作上遇到的套件學習整理,給自己一個鼓勵 ୧ʕ•̀ᴥ•́ʔ୨ (耶~)


參考資料:

Tad 教材網
TCPDF筆記
Dev Resources - TCPDF methods