PHPのバージョンを8に上げたらPDFファイルを生成するライブラリでエラーが出たので修正した話し

  • 2023.07.25
  • PHP

以前、PHP7にバージョンアップした時の話を書いたんですけど、下の記事です。

今度は、PHP8にバージョンアップして、動かなくなったので修正した話です。

後、PHPのバージョンに関係ないですけど、PDFに配置する画像がJPEGでなくてPNGになると、「FPDF エラー:アルファ チャネルがサポートされていません:」とエラーがでるので、これも修復しないといけません。

それで、現在使っているライブラリーのバージョンが

FPDF – Varsion1.6 Date: 2008-08-03
FPDI – Version 1.3 Copyright 2004-2009 Setasign – Jan Slabon
FPDF_TPL – Version 1.1.3 Copyright 2004-2009 Setasign – Jan Slabon

で、随分古いので、まずはアップデートされたバージョンがないかWebで検索しました。

すると

FPDFはこちらの公式サイト  http://www.fpdf.org/  で最新版(1.85)が入手できました。

FPDI こちら https://www.setasign.com/products/fpdi/downloads/ で入手できました。

そして、ライブラリを格納していたディレクトリのファイルを置き換えていきます。

日本語対応をするために、japanese.phpを使用していまして、そのjapanese.phpのrequire文を新しいバージョンのファイル名に変更します。

require(DIR . '/fpdi.php');
↓
require( __DIR__ . '/Fpdi.php');

FPDIのライブラリのファイルは、comporserってので、インストールできるみたいだけど、よくわからないので、PHPが出す「Classがない」のエラーを見ながら、require_onceでファイルを読み込んで対応していく。

Fatal error: Uncaught Error: Class ‘Fpdi’ not found  ファイルを読み込んでいるのに類のエラーが出る。

最初は、よくわからなかったが、namespace setasign\Fpdi; のようにネームスペースを定義(設定?)しているからだった。

なので、

class PDF_Japanese extends \setasign\Fpdi\Fpdi

のようにクラスにアクセスすればよい。

このように、少しずつエラーを解消していったが、最後に(この時は最後かどうかわからなかったのだが)残ったエラーがこれ。

Fatal error: Uncaught Exception: FPDF error:

fpdf.php on line 273 で出てる

Fatal error: Uncaught Exceptionで検索をしても、有効な情報は見つからない。

それで、japanese.phpが古いままなので、アップデートされたバージョンがないかと「japanese.php」検索をしてみると、こちらのページが見つかった

tFPDFでjapanese.phpを利用する

こちらのページに書いてある「tFPDF」のファイルをダウンロードして、適用する。

http://www.fpdf.org/en/script/dl.php?id=92&f=zip

fpdf.phpを読み込んでいたのは、FpdfTpl.phpだったので、そのコードを下記のように変更

<?php

/**
 * This file is part of FPDI
 *
 * @package   setasign\Fpdi
 * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com)
 * @license   http://opensource.org/licenses/mit-license The MIT License
 */

namespace setasign\Fpdi;

require(__DIR__ . '/FpdfTplTrait.php');
//require(__DIR__ . '/fpdf.php'); を↓に変更
require( __DIR__ . '/tfpdf/tfpdf.php');

/**
 * Class FpdfTpl
 *
 * This class adds a templating feature to FPDF.
 */
//class FpdfTpl extends \FPDF を↓に変更
class FpdfTpl extends \tFPDF
{
    use FpdfTplTrait;
}

これで、エラーがなくなり解決