カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

TCPDFで日本語フォントを使う方法

PHPでPDFを生成するライブラリとして有名な TCPDF。
便利な反面「日本語フォントが文字化けする…」「どうやって日本語フォントを追加するの?」と悩む人も多いのではないでしょうか。

この記事では、Noto Sans JP を例に TCPDF へ日本語フォントを追加する手順を、初めての方でも迷わないように詳しく解説します。

TCPDF が日本語フォントをそのまま扱えない理由

TCPDFはデフォルトで日本語をサポートしておらず、Unicodeフォントを 「CIDフォント or TTF埋め込み」 として自分で追加する必要があります。

つまり、

  • 日本語フォント(.ttf)をTCPDF専用形式に変換
  • PHPから使用できるようにフォント情報を登録
  • 生成した PDF にフォントをセット

という3ステップが必要になります。

事前準備:TCPDFにフォントを追加する方法は2つ

TCPDFの日本語対応には以下の2通りの方法があります。

方法 特徴
① CIDフォント(KozMinなど)を使う 簡単。ファイルサイズが小さい。見た目が古め。
② 独自フォント(TTF)を埋め込む ← この記事で解説 フリーフォント利用可。自由度高い。PDFサイズは大きくなる。

今回はニーズが多い Noto Sans JP の TTF を埋め込む方法 を扱います。

続きを読む…»

63 views

PHP-FPM .user.iniでアップロード可能容量設定

PHP-FPMの.user.ini設定を少し深掘りしてみます。

ファイルのアップロード可能な容量制限を変更するとき、次のような設定をすることがあります。

memory_limit = 256M
upload_max_filesize = 10M
post_max_size = 12M

しかし、実はこれうまくいきません。
このうち.user.iniで完全に反映できるのはmemory_limitのみです。
他2つは.user.iniではphpinfo()に反映されても、実際の動作には反映されない可能性が高いです。

各ディレクティブの.user.ini適用可否
ディレクティブ .user.iniに設定 phpinfo() に反映 動作に反映されるか
memory_limit できる 表示される 動作にも反映
post_max_size 一部反映される 表示される 動作には反映されない(FPM起動前に必要)
upload_max_filesize 一部反映される 表示される 動作には反映されない(FPM起動前に必要)

なぜupload_max_filesize・post_max_sizeが効かないのか

これらはPHPがファイルやPOSTデータを受け取る前に使われる設定のためです。

post_max_size:PHPがPOSTデータ全体を読み込む前に必要

upload_max_filesize:ファイルアップロード制御も同様にPHPエンジンが処理を始める前に評価

.user.iniは「スクリプトが実行される直前」に読み込まれるため、POSTボディがすでに破棄された後ということになります。

正しい設定方法(PHP-FPM環境)

.user.iniではなくFPMの構成ファイル(www.conf)かphp.iniに設定します。

続きを読む…»

795 views

PHP-FPMで.htaccessにphp_valueを使うと500 Internal Server Errorが発生

特定のディレクトリでPHPの設定を変更するため、.htaccessを作成し以下のように設定していたら500 Internal Server Errorが発生しました。

php_value memory_limit 128M
php_value max_execution_time 0

調査したところ、PHP動作モードがFPM(FastCGI Process Manager)であることが原因でした。
phpinfoのServer APIがFPM/FastCGIになっている場合です。

どうやらPHP-FPMでは.htaccessにphp_valueを使った設定変更が出来ないようなのです。
※.htaccess自体が使えないわけではありません。

解決法

CGI版で使用できる設定ファイル.user.iniを使います。

設定例は以下のようになります。

memory_limit 128M
max_execution_time 0

Apacheの設定で.user.iniへのアクセスを拒否する設定があるか確認、なければ設定しておいてください。

PHP: .user.ini ファイル – Manual
760 views

文字列”false”をbool型にキャストするとtrueになる問題

文字列”false”をbool型として扱いたい場合、単純にキャストしてしまうとfalseの動作を期待しているのに意図とは反対にtrueの動作となってしまうことがあるので注意が必要です。

例えば以下のように文字列”false”をbool型にキャストしてみます。

$bool = (bool)"false";
var_dump($bool);

するとどうでしょう。以下のような結果が返ってきます。

bool(true)

“false”をキャストしたのにtrueとなってしまいます。
この原因はキャストだとfalseとは認識されず、”false”というただの文字列という認識となり空文字ではないという判断になるためです。

公式のマニュアルを見てみてください。
booleanへの変換

  • boolean の false
  • integer の 0 (ゼロ)
  • float の 0.0 および -0.0 (ゼロ)
  • 空の文字列 “”、 および文字列の “0”
  • 要素の数がゼロである 配列
  • unit 型 NULL (値がセットされていない変数を含む)
  • bool 型へキャストするように動作がオーバーロードされた内部オブジェクト。 例: 属性がない空要素から作成された SimpleXML オブジェクト。

上記以外は全てtrueとみなされます。

ではどうすれば良いでしょうか。
続きを読む…»

646 views

XAMPPでPHPのモジュール版・CGI版切り替え

PHPにはモジュール版・CGI版の2種類があります。
主な違いは次の通りです。
モジュール版:ApacheのrootユーザーでPHPを実行・処理が速い
CGI版:ユーザー毎のPHP実行環境・セキュリティや安全性に優れている・モジュール版より遅い

XAMPPを使ってローカル環境で開発している場合、特に切り替えが必要なケースは稀かと思いますが、
参考までに切り替えの方法を記載しておきます。

httpd.conf

以下の行をコメント解除します。

#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

httpd-xampp.conf

モジュール用セットアップの記述をコメントアウト
※PHP7の場合の例です。

#
# PHP-Module setup
#
LoadFile "/xampp/php/php7ts.dll"
LoadFile "/xampp/php/libpq.dll"
LoadFile "/xampp/php/libsqlite3.dll"
LoadModule php7_module "/xampp/php/php7apache2_4.dll"

<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
    SetHandler application/x-httpd-php-source
</FilesMatch>

CGI用セットアップの記述をコメント解除します。

#
# PHP-CGI setup
#
#<FilesMatch "\.php$">
#    SetHandler application/x-httpd-php-cgi
#</FilesMatch>
#<IfModule actions_module>
#    Action application/x-httpd-php-cgi "/php-cgi/php-cgi.exe"
#</IfModule>

PHPINFOを表示し、Server APIの欄を確認します。
こちらがApache 2.0 Handlerとなっていればモジュール版、
CGI/FastCGIになっていればCGI版で動作していることになります。

1,506 views