プログラミング

PHPでPDFを作成する方法

hebishima.shogo

はい、hebiです。

毎日手動で集計した情報をPDF化してチャットに送信する作業を自動化したい。という要望の対応を行いました。

本記事では対応した一部のPHPでPDF化を行う方法を記事にしたいと思います。

PDFを出力するためのライブラリTCPDFを使います。

今回はcomposerを使ってTCPDFをインストールしますが、手動で配置する場合は以下のgithubからダウンロードできます。

あわせて読みたい
TCPDF githubからダウンロード
TCPDF githubからダウンロード
スポンサーリンク

前提

本記事では以下記事で作成したCodeIgniter4のプロジェクトで行っていきます。
また、composerを使ってインストールしますので、composerについても以下の記事を参考ください。

あわせて読みたい
【PHP】CodeIgniter4のインストール方法
【PHP】CodeIgniter4のインストール方法

PDF作成手順

PHPでPDFを作成する手順を記述していきます。

TCPDFのインストール

Tera Termでログインし、カレントディレクトリをプロジェクトのディレクトに移動します。

cd /var/www/html/my_codeigniter_project

composerを実行してTCPDFをインストールします。

composer require tecnickcom/tcpdf

「Using version ^6.7 for tecnickcom/tcpdf」のようなメッセージが表示されインストール完了すると、「/var/www/html/my_codeigniter_project/vendor/tecnickcom/tcpdf」にソースコードが保存されます。

PDF化するクラスを作成

今回メインの処理となるPDF化するクラスをapp\Librariesに作成しましょう。

<?php

namespace App\Libraries;

use TCPDF;

class Pdf extends TCPDF
{
    public function __construct()
    {
        parent::__construct();
    }

    // PDFを生成する。
    public function generatePDF($content)
    {        
        // ページを追加します。
        $this->AddPage();

        // フォントとサイズを設定します。
        $this->SetFont('kozgopromedium', '', 12);

        // HTMLを挿入します。
        $this->writeHTML($content);

        // 出力するパス
        $pdfFilePath = WRITEPATH . 'sample.pdf'; // PDFファイルの保存先パス
        // PDFを出力します。
        $this->Output($pdfFilePath, 'F');

    }
}

WRITEPATH(/var/www/html/my_codeigniter_project/writable)にsample.pdfを出力するgeneratePDF関数を作成しました。

フォントは/vendor/tecnickcom/tcpdf/fontsに配置されているフォントを利用できます。

$this->Outputの第2引数には以下の設定が行えます。

  • $this->Output($pdfFilePath, ‘F’)
    指定したパスに出力します。
  • $this->Output(‘sample.pdf’, ‘I’)
    ブラウザにPDFを表示します。(httpだと上手く表示されませんでした。httpsで表示する必要がありそうです)
  • $this->Output(‘sample.pdf’, ‘D’)
    PDFをダウンロードします。

generatePDFを実行するコントローラ作成

generatePDFを実行し、PDFを出力してみましょう。
コントローラを作成し、実行するとPDFを出力できるようにします。

<?php

namespace App\Controllers;

use App\Libraries\Pdf;

class PdfController extends BaseController
{
    public function index()
    {
        // PDF内容の生成
        $content = '<table border="1">
                        <tr>
                            <td>Column</td>
                            <td>Column</td>
                            <td>Column</td>
                        </tr>
                        <tr>
                            <td>Data</td>
                            <td>Data</td>
                            <td>Data</td>
                        </tr>
                        <tr>
                            <td>Data</td>
                            <td>Data</td>
                            <td>Data</td>
                        </tr>
                    </table>';
        // Pdfライブラリのインスタンスを作成
        $pdf = new Pdf();

        // PDFを生成
        $pdf->generatePDF($content);
    }
}

ルーティング設定

PdfControllerを実行できるようにルーティングの設定を行います。

<?php

use CodeIgniter\Router\RouteCollection;

/**
 * @var RouteCollection $routes
 */
$routes->get('/', 'Home::index');

// ユーザ取得
$routes->get('user/(:num)', 'User::get_user/$1');

// ユーザ追加
$routes->post('user/', 'User::add_user');

// PDF出力
$routes->get('pdf', 'PdfController::index');

以上でPDF出力処理の実装完了です。

「http://ドメイン名/pdf」にアクセスすると、/writable/sample.pdfに出力されます!

以下のようにスタイルを適用することもできます。

        // PDF内容の生成
        $style = '<style>
                    td {   
                        color: #ff00ff;
                        text-align: center;
                    }
                 </style>';
        $content = '<table border="1">
                        <tr>
                            <td>Column</td>
                            <td>Column</td>
                            <td>Column</td>
                        </tr>
                        <tr>
                            <td>Data</td>
                            <td>Data</td>
                            <td>Data</td>
                        </tr>
                        <tr>
                            <td>Data</td>
                            <td>Data</td>
                            <td>Data</td>
                        </tr>
                    </table>';
        $content = $style . $content; 
        // Pdfライブラリのインスタンスを作成
        $pdf = new Pdf();

        // PDFを生成
        $pdf->generatePDF($content);

ただし、なぜかmargin、paddingやvertical-alignのスタイルを適用することができません。適用する方法ご存じの方いたらコメントいただけると嬉しいです。。

2024/05/08追記

writeHTMLは以下のスタイルのみ適用可能とのことです。

  • font-family
  • font-size
  • font-weight
  • font-style
  • color
  • background-color
  • text-decoration
  • width
  • height
  • text-align
あわせて読みたい
stackoverflow
stackoverflow

最後に

いかがだったでしょうか。PDFを出力することはできましたでしょうか?

DBから取得したデータをPDFに出力して、SlackやらMattermostやらのチャットに送信することで、自動でレポートを共有することができるようになります。

日々時間のかかる作業は自動化していきたいですね(;’∀’)

最後までお読みいただきありがとうございました(^^♪

スポンサーリンク
ABOUT ME
hebi
hebi
エンジニア
フルスタックエンジニアとして活躍中。
HTML5プロフェッショナル認定Level1、Level2所持者です。

未経験の方でも簡単にプログラミングを学べるようにと情報を発信しております。
記事URLをコピーしました