Breathnote
laravel-dompdfの改行ルールを変更する

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で指定した改行ルールが適用されます。

所感

パッケージライブラリって、大多数がアルファベット前提でセッティングされているので、思わぬ部分で困る時があります。