Interventionで日本語表示対策。imagettfbbox、any2eucjp
.表題のとおり。Interventionで日本語などのマルチバイト画像文字を表示しようとする際に、日本語だと、エラーが出る場合がある。その解決方法。
次のようなエラーがでた。
imagettfbbox(): any2eucjp(): invalid code in input string {"exception":"[object] (ErrorException(code: 0): imagettfbbox(): any2eucjp(): invalid code in input string at /usr/home/webapp/vendor/intervention/image/src/Intervention/Image/Gd/Font.php:85) [stacktrace] #0 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(2, 'imagettfbbox():...', '/usr/home/...', 85, Array) #1 /usr/home/webapp/vendor/intervention/image/src/Intervention/Image/Gd/Font.php(85): imagettfbbox(38, 0, '/usr/home/...', '\\xE3\\x82\\x8A') #2 /usr/home/webapp/vendor/intervention/image/src/Intervention/Image/Gd/Font.php(140): Intervention\\Image\\Gd\\Font->getBoxSize() #3 /usr/home/webapp/vendor/intervention/image/src/Intervention/Image/Commands/TextCommand.php(30): Intervention\\Image\\Gd\\Font->applyToImage(Object(Intervention\\Image\\Image), 4, 15) #4 /usr/home/webapp/vendor/intervention/image/src/Intervention/Image/AbstractDriver.php(92): Intervention\\Image\\Commands\\TextCommand->execute(Object(Intervention\\Image\\Image)) #5 /usr/home/webapp/vendor/intervention/image/src/Intervention/Image/Image.php(106): Intervention\\Image\\AbstractDriver->executeCommand(Object(Intervention\\Image\\Image), 'text', Array)
imagettfbbox、any2eucjpの2つのエラーログを見ることができるが、imagettfbbox()、any2eucjp()いずれもGDのAPIだと思われる。any2eucjp()はLibraryのソースからはcallされていないので、imagettfbbox()の内部でany2eucjpが実行されいているぽい。
エラーの内容としては、エンコーディングが適切にできていないよう。エンコーディングを正しくしていしてあげるとよさそう。imagettfbboxが呼ばれる前に適切にエンコーディングをしてあげる。ちなみに、「mb_convert_encoding」だと動かなかった。
$char = mb_encode_numericentity($char, array(0x0080, 0xffff, 0, 0xffff), 'UTF-8');
サンプルコード
$char = mb_encode_numericentity($char, array(0x0080, 0xffff, 0, 0xffff), 'UTF-8'); $this->image->text($char, $marginLeft, $marginTop, function($font) { $font->file($this->font()); $font->size($this->fontSize()); $font->color($this->fontColor()); $font->align('left'); $font->valign('top'); $font->angle($this->angle()); });
なお、DOMPDFのソースを参考にした。
ライブラリ側で解消されるべきだと思うので、プルリクを送っておいた。
- Pull request on Intervention
- 画像:Clker-Free-Vector-Images / Pixabay