Interventionで日本語表示対策。imagettfbbox、any2eucjp

by codechord. 0 Comments

  • このエントリーをはてなブックマークに追加
  • このエントリーをはてなブックマークに追加

表題のとおり。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のソースを参考にした。
ライブラリ側で解消されるべきだと思うので、プルリクを送っておいた。

Posted in PHP


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA