PHP7に PDF Haru拡張をインストール

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バージョンが対応外であるため失敗します。

```shell:PHP Extention haru Install
>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 が必要です。

```shell:Install requisite modules and programs
>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 )。

```shell:Get and expand libharu source file
>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します。

https://github.com/libharu/libharu/wiki/Installation

```shell:Build and install libharu
cd /usr/local/src
mkdir haru-build
cd /usr/local/src/haru-build
cmake ../libharu-2.4.4 && make && make install
```


## PHP7対応 haru拡張のビルド

gitでソースをクローンします。

```shell:Clone pecl-haru for PHP7
cd /usr/local/src
git clone https://github.com/dionx/pecl-haru.git
cd /usr/local/src/pecl-haru 
```

取り込んだソースのままではコンパイルエラーになるため、haru.c に以下のパッチを当てます。

```diff:haru.diff
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.. */
```

```shell:Build pecl-haru for PHP7
>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
```shell:ld.so.conf.d設定例
[ld.so.conf.d]# ls userlib.conf
userlib.conf
[ld.so.conf.d]# cat userlib.conf
/usr/local/lib64
```

https://qiita.com/Esfahan/items/0064d845ca6faf7f3d47#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%85%A8%E4%BD%93%E3%81%A7%E6%B0%B8%E7%B6%9A%E7%9A%84%E3%81%AB%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88

## haru拡張有効化

拡張を有効化するために、php.ini または 追加設定ディレクトリ php.dのファイルで extension=haru を指定（ Docker では  docker-php-ext-enable haru　で有効化 )

/etc/php.d
```shell:haru拡張有効化例
[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は読み込まれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3353822/cd0f80d6-0338-a587-da27-ce25117914c6.png)