tcpdf を使っていて、PDFが表示されるまで時間がかかりすぎるという問題に悩んでいました。haruで解決しました。
haruについて
haru の使い方は以下記事で紹介されています。
https://codezine.jp/article/detail/7141
haru のクラスメソッド説明(英文)
https://durak.org/sean/pubs/software/php-7.0.0/book.haru.html
tcpdf との相違
- 座標原点が左下
- テキスト/画像などの位置決めの原点も左下
- 文字エンコーディングが Shift JIS
- 座標単位がポイントのみ
メソッド名は異なりますが、引数は似通っています。
ソースからビルドする必要性
pecl で PDF Haru拡張機能を PHP7 にインストールしようとすると、PHPバージョンが対応外であるため失敗します。
>pecl install haru
pecl/haru requires PHP (version >= 5.1.3, version <= 6.0.0, excluded versions: 6.0.0), installed version is 7.4.15
No valid packages found
install failed
そこで libharu と PHP7に対応した haru拡張をソースからビルドしてインストールします。
必須ライブラリ/プログラムのインストール
ソース取得には wget, git、libharu ビルドには cmake, zlib, libpgn, haru拡張には php-devel,libtool が必要です。
>apt install zlib1g-dev libpng-dev cmake php-dev libtool wget git
libharuビルド
Githubからcloneすると最新版が取り込まれます。v2.4.4 に固定するため tarボールを wget します( 2023/9月現在の最新版は v2.4.4 )。
>wget -P /var/tmp https://github.com/libharu/libharu/archive/refs/tags/v2.4.4.tar.gz
>tar xvzf /var/tmp/v2.4.4.tar.gz -C /usr/local/src
/usr/local/src/libharu-2.4.4 に展開されます。
ビルドは次のページに従って make / make installします。
cd /usr/local/src
mkdir haru-build
cd /usr/local/src/haru-build
cmake ../libharu-2.4.4 && make && make install
PHP7対応 haru拡張のビルド
gitでソースをクローンします。
cd /usr/local/src
git clone https://github.com/dionx/pecl-haru.git
cd /usr/local/src/pecl-haru
取り込んだソースのままではコンパイルエラーになるため、haru.c に以下のパッチを当てます。
2050c2050
< case HPDF_PROJECTING_SCUARE_END:
---
> case HPDF_PROJECTING_SQUARE_END:
5803c5803
< HARU_CLASS_CONST(ce_harupage, "PROJECTING_SCUARE_END", HPDF_PROJECTING_SCUARE_END);
---
> HARU_CLASS_CONST(ce_harupage, "PROJECTING_SQUARE_END", HPDF_PROJECTING_SQUARE_END);
5870c5870
< HARU_CLASS_CONST(ce_haruencoder, "BYTE_TYPE_TRAIL", HPDF_BYTE_TYPE_TRIAL); /* note the typo in the original name.. */
---
> HARU_CLASS_CONST(ce_haruencoder, "BYTE_TYPE_TRAIL", HPDF_BYTE_TYPE_TRAIL); /* note the typo in the original name.. */
>patch haru.c < ./haru.diff (パッチ)
>phpize
>./configure --with-php-config=/usr/bin/php-config
>make
>make test ( haru.so がロードすることを確認 )
>make install
configure に --with-php-config オプションで php-config を指定すると、拡張ファイルが正しいPHP拡張フォルダにインストールされるようになります。指定しないとソースディレクトリの modulesディレクトリにインストールされました。
make test を実行すると、libhpdf.so.2.4 が見つからないというエラーで haru.soがロードされませんでした。/usr/local/lib64 にインストールされていたので、このディレクトリが共有ライブラリフォルダとして検索されるように設定後 ( /etc/ld.so.conf.d 内に userlib.confファイルを作成、そのファイルで /usr/local/lib64 を指定後、 ldconfig 実行 )、ロード成功
/etc/ld.so.conf.d
[ld.so.conf.d]# ls userlib.conf
userlib.conf
[ld.so.conf.d]# cat userlib.conf
/usr/local/lib64
haru拡張有効化
拡張を有効化するために、php.ini または 追加設定ディレクトリ php.dのファイルで extension=haru を指定( Docker では docker-php-ext-enable haru で有効化 )
/etc/php.d
[php.d]$ ls 20-haru.ini
20-haru.ini
[php.d]$ cat 20-haru.ini
extension=haru
Webサーバ/php-fpm再起動
最後にWebサーバや php-fpmを再起動して、phpinfo() で haru が表示されたら成功。php-fpmを使っている場合、php-fpmを再起動しないと haruは読み込まれません。