laravel-dompdfの改行ルールを変更する
Laravelを使ったWEBシステムの帳票発行機能にlaravel-dompdfを利用したのですが、CSSを用いた改行ルールの変更に苦労しました。
問題点
dompdfは、Bladeに記述したHTMLをもとに、PDFを生成します。
HTMLを利用できるため、レイアウトもCSSを用いてスタイリングできるわけですが、dompdfは、改行関係のCSSプロパティとしてwhite-space
のみ有効です。
CSS
/* 効く */
white-space: nowrap;
/* 効かない */
line-break: anywhere;
overflow-wrap: break-word;
word-wrap: break-word;
word-break: break-all;
何故でしょうか?
原因
PDF生成時、dompdf側で独自の改行処理を行っているからです。
コードとしてはvendor\dompdf\dompdf\src\FrameReflower\Text.php
の$_wordbreak_pattern
。
Text.php
// The regex splits on everything that's a separator (^\S double negative), excluding nbsp (\xa0), plus dashes
// This currently excludes the "narrow nbsp" character
public static $_wordbreak_pattern = '/([^\S\xA0]+|\-+|\xAD+)/u';
上記の正規表現に合致する文字列が強制的に改行対象となるため、CSSでスタイリングしても意味がないのです。
対処法
パッケージのオーバーライドが大変かもしれませんが、正規表現を書き換えましょう。
Text.php
// The regex splits on everything that's a separator (^\S double negative), excluding nbsp (\xa0), plus dashes
// This currently excludes the "narrow nbsp" character
// public static $_wordbreak_pattern = '/([^\S\xA0]+|\-+|\xAD+)/u';
public static $_wordbreak_pattern = '//u';
これで、dompdf側が改行処理を挟まなくなりました。CSSで指定した改行ルールが適用されます。
所感
パッケージライブラリって、大多数がアルファベット前提でセッティングされているので、思わぬ部分で困る時があります。