読者です 読者をやめる 読者になる 読者になる

いけむランド

はてダからやってきました

laravel-dompdf で日本語を扱う

Laravel からいい感じに日本語 PDF を生成したかったのでいろいろと調べてみた。


まずは laravel-dompdf を composer.json に追加する。

あとは以下の README に書いてあるとおりに PDF::loadView とかで PDF を生成するだけだが、それだけだとアルファベットしか印字されていない PDF しかできない。

$pdf = PDF::loadView($view);
$binary = $pdf->output();


dompdf で日本語を扱うには以下の記事を参考にすればよい...

のだが、composer で dompdf を入れていると load_font.php を呼ぶ時に他のライブラリを参照するための include_path の設定がめんどい。

% cd vendor/dompdf/dompdf
% php ./load_font.php ipagothic /usr/share/fonts/truetype/fonts-japanese-gothic.ttf
PHP Fatal error:  require_once(): Failed opening required '/hogehoge/vendor/dompdf/dompdf/lib/php-font-lib/classes/Font.php' (include_path='.:/usr/share/php:/usr/share/pear') in /hogehoge/vendor/dompdf/dompdf/dompdf_config.inc.php on line 332


(php-font-lib は vendor/phenx/php-font-lib にインストールされる。)

そこで手元の環境では artisan のサブコマンドをつくり、そこに load_font.php の中身をコピペして解決した。

ちなみに load_font されたフォントは app/storage/fonts 配下にコピーされる。同じくこのディレクトリにある dompdf_font_family_cache.php がフォント名とフォントのマップになっている。

  'ipagothic' => 
  array (
    'normal' => DOMPDF_FONT_DIR . 'fonts-japanese-gothic',
    'bold' => DOMPDF_FONT_DIR . 'fonts-japanese-gothic',
    'italic' => DOMPDF_FONT_DIR . 'fonts-japanese-gothic',
    'bold_italic' => DOMPDF_FONT_DIR . 'fonts-japanese-gothic',
  ),


これで PDF を生成すると無事に日本語も印字されるが、如何せんフォントが埋め込まれていることで数行の日本語の文章だけでもサイズが軽く数 MB 程度になってしまう。

さらに調べてみたところ、使用する文字のフォント情報だけを埋め込むオプションが見つかったため、それを指定するとサイズを数十 KB 程度に落とすことができた。

$pdf = PDF::loadView($view);
$pdf->getDomPDF()->set_option('enable_font_subsetting', true); // 追加
$binary = $pdf->output();