Love澤's Tech Room

技術系ネタをまとめていくブログ。更新頻度は高くありません。

JpGraph Error: 25049が出た時の対処方法

やりたかったこと

JpGraphを使って折れ線グラフを描画する。

エラーが起きた状況

PHPでJpGraphを利用する際に、以下のように記述。フォントは明朝体に設定。

<?php
(中略)
// グラフの描画先
$g = new Graph(400, 400); // サイズ
$g->setScale('textlin'); // 目盛り
$g->title->setFont(FF_MINCHO, FS_NORMAL, 14); // タイトルフォント
$g->title->set('テストタイトル'); // タイトル
$g->legend->setFont(FF_MINCHO, FS_NORMAL, 14); // 凡例フォント
(中略)
?>

エラー内容

以下の様なエラーが出た。
f:id:love_zawa:20150118073437p:plain
画像ではipampp.ttfとなっているが、エラーを起こすためにわざとそのようにした。実際のエラーは以下のとおり。

JpGraphError: 25049
Font file "/usr/share/fonts/ipa-gothic/ipam.ttf" is not readable or does not exist.

エラー文をみると、「ipa-gothic」ディレクトリに明朝体フォント「ipam.ttf」を探しに行っていることがわかる。

対策(簡単)

必要フォントを、「JpGraphに関するファイルが保存されているディレクトリ/fonts/」に配置する。

色々と試行錯誤したが、結局はこちらの対策に落ち着いた。

自分の場合だと、以下の様な構成になっている。

  • public_html/
    • line.php
    • JpGraph/
      • jpg-config.inc.php, jpgraph_ttf.inc.php, など
      • fonts/
        • ipag.ttf, ipagp.ttf, ipam.ttf, ipamp.ttf

JpGraphでは、JpGraph/Fonts/にフォントがあるか読み込みに行き、ない場合にはシステムのフォントディレクトリにを読み込みに行く。そのため、JpGraph/Fonts/に必要フォントを配置することで、問題が解決される。

対策(ちょっと面倒)

jpg-config.inc.phpとjpgraph_ttf.inc.phpの設定を調整する。

設定ファイル類を直接いじることになるので、ちょっと面倒。上でも書いたが、エラー文をみると、「ipa-gothic」ディレクトリに明朝体フォント「ipam.ttf」を探しに行っているため、それを解消することを試みる。

まずjpg-config.inc.phpは40行目あたりを以下のように設定する。

<?php
// define('MBTTF_DIR','/usr/share/fonts/ipa-gothic/');  // delete
// define('TTF_DIR','/usr/share/fonts/ipa-gothic/');    // |
define('TTF_DIR_M', '/usr/share/fonts/ipa-mincho/');    // add
define('TTF_DIR_PM', '/usr/share/fonts/ipa-pmincho/');  // |
define('TTF_DIR_G', '/usr/share/fonts/ipa-gothic/');    // |
define('TTF_DIR_PG', '/usr/share/fonts/ipa-pgothic/');  // |
?>

上記からもわかるように、なぜかTTF_DIRやMBTTF_DIRがipa-gothicに設定されていた。今回、JpGraphは古いサーバで使っていたものを新しいサーバへコピーしてきたものである。おそらく、これはデフォルトでこのようになっていたのではなく、古いサーバにあわせて書き換えられていたのだと思う。

次に、ipgraph_ttf.inc.phpは495行目あたりを以下のように設定する。

<?php
// check jpgraph/src/fonts dir
$jpgraph_font_file = $jpgraph_font_dir . $font_file;
if (file_exists($jpgraph_font_file) === true && is_readable($jpgraph_font_file) === true) {
    $font_file = $jpgraph_font_file;
    break;
}

// check OS font dir
// if ($family >= FF_MINCHO && $family <= FF_PGOTHIC) {  // delete
//     $font_file = MBTTF_DIR.$font_file;                // |
if ($family == FF_MINCHO) {              // add
    $font_file = TTF_DIR_M.$font_file;   // |
}                                        // |
else if ($family == FF_PMINCHO) {        // |
    $font_file = TTF_DIR_PM.$font_file;  // |
}                                        // |
else if ($family == FF_GOTHIC) {         // |
    $font_file = TTF_DIR_G.$font_file;   // |
}                                        // |
else if ($family == FF_PGOTHIC) {        // |
    $font_file = TTF_DIR_PG.$font_file;  // |
}
// else {                                // delete
//     $font_file = TTF_DIR.$font_file;  // |
// }                                     // |
?>

以上の設定で、フォントをJpGraph/fonts/以下に配置しなくてもよくなった。


なお、FF_**という変数がでてきたが、これらは同ファイル32行目あたりに以下のように定義されている。

<?php
define("FF_MINCHO",40);
define("FF_PMINCHO",41);
define("FF_GOTHIC",42);
define("FF_PGOTHIC",43);
?>

また、同ファイル348行目あたりには

<?php
$this->font_files= array(
    中略
    /* Japanese fonts */
    FF_MINCHO  =>  array(
        FS_NORMAL =>MINCHO_TTF_FONT,
        FS_BOLD =>'',
        FS_ITALIC =>'',
        FS_BOLDITALIC =>''
    ),
    FF_PMINCHO => array(
    中略
);
?>

と定義されており、その中で出てくる、MINCHO_TTF_FONTなどは同ファイル137行目あたりに以下のように定義されている。

<?php
define('MINCHO_TTF_FONT','ipam.ttf');
define('PMINCHO_TTF_FONT','ipamp.ttf');
define('GOTHIC_TTF_FONT','ipag.ttf');
define('PGOTHIC_TTF_FONT','ipagp.ttf');
?>