Question

Usually I am pretty good debugging problems, this one just seems to keep getting around me. I have installed the JpGraph library at /usr/share/php/jpgraph/ and have it working for basic graphs. The problem I am having is not being able to read the fonts our of /usr/share/fonts/truetype/ I have arial.ttf installed there with owner and group set to root and chmod to 644 but it is still not being read.

This shows the files on the server:

root@CBC-SVR-01:/usr/share/fonts/truetype# ls
arialbd.ttf  cour.ttf                    gentium-basic  verdanab.ttf
ariali.ttf   DejaVuSans-BoldOblique.ttf  liberation     verdanai.ttf
arial.ttf    DejaVuSans-Bold.ttf         openoffice     verdana.ttf
comic.ttf    DejaVuSans-Oblique.ttf      timesbd.ttf
courbd.ttf   DejaVuSans.ttf              times.ttf
couri.ttf    gentium                     ttf-dejavu

Here are the file permissions:

root@CBC-SVR-01:/usr/share/fonts/truetype# ls -l
total 5108
-rw-r--r-- 1 root root 284560 Jan 20 13:27 arialbd.ttf
-rw-r--r-- 1 root root 207808 Jan 20 13:27 ariali.ttf
-rw-r--r-- 1 root root 296712 Jan 20 13:27 arial.ttf
-rw-r--r-- 1 root root 126364 Jan 20 13:38 comic.ttf
-rw-r--r-- 1 root root 312920 Jan 20 13:31 courbd.ttf
-rw-r--r-- 1 root root  60856 Jan 20 13:35 couri.ttf
-rw-r--r-- 1 root root 303296 Jan 21 17:27 cour.ttf
-rw-r--r-- 1 root root 574636 Sep 29  2010 DejaVuSans-BoldOblique.ttf
-rw-r--r-- 1 root root 634184 Sep 29  2010 DejaVuSans-Bold.ttf
-rw-r--r-- 1 root root 574456 Sep 29  2010 DejaVuSans-Oblique.ttf
-rw-r--r-- 1 root root 683528 Sep 29  2010 DejaVuSans.ttf
drwxr-xr-x 2 root root   4096 Apr 17 16:11 gentium
drwxr-xr-x 2 root root   4096 Apr 17 16:11 gentium-basic
drwxr-xr-x 2 root root   4096 Apr 17 16:11 liberation
drwxr-xr-x 2 root root   4096 Apr 17 16:11 openoffice
-rw-r--r-- 1 root root 334944 Jan 20 13:33 timesbd.ttf
-rw-r--r-- 1 root root 347988 Jan 20 13:37 times.ttf
drwxr-xr-x 2 root root   4096 Apr 17 16:11 ttf-dejavu
-rw-r--r-- 1 root root 137616 Jan 20 13:31 verdanab.ttf
-rw-r--r-- 1 root root 155076 Jan 20 13:47 verdanai.ttf
-rw-r--r-- 1 root root 149752 Jan 20 13:32 verdana.ttf

Here is the fonts directory permissions

root@CBC-SVR-01:/usr/share/fonts# ls -l
total 12
drwxr-xr-x 4 root root 4096 Nov 12 22:44 cmap
drwxr-xr-x 7 root root 4096 Apr 17 16:11 truetype
drwxr-xr-x 3 root root 4096 Nov 12 22:44 type1

But the problem is that PHP and JpGraph are not able to read the font file???

Missing fonts

If i run the following script from the command line with root user it shows bool(true) However, If browse to the same script through the web, it shows bool(false).

<?php

var_dump(file_exists("/usr/share/fonts/truetype/arial.ttf"));

?>

Here is the config file for JpGraph:

<?php
//=======================================================================
// File:        JPG-CONFIG.INC
// Description: Configuration file for JpGraph library
// Created:     2004-03-27
// Ver:         $Id: jpg-config.inc.php 1871 2009-09-29 05:56:39Z ljp $
//
// Copyright (c) Asial Corporation. All rights reserved.
//========================================================================


//------------------------------------------------------------------------
// Directories for cache and font directory.
//
// CACHE_DIR:
// The full absolute name of the directory to be used to store the
// cached image files. This directory will not be used if the USE_CACHE
// define (further down) is false. If you enable the cache please note that
// this directory MUST be readable and writable for the process running PHP.
// Must end with '/'
//
// TTF_DIR:
// Directory where TTF fonts can be found. Must end with '/'
//
// The default values used if these defines are left commented out are:
//
// UNIX:
//   CACHE_DIR /tmp/jpgraph_cache/
//   TTF_DIR   /usr/share/fonts/truetype/
//   MBTTF_DIR /usr/share/fonts/truetype/
//
// WINDOWS:
//   CACHE_DIR $SERVER_TEMP/jpgraph_cache/
//   TTF_DIR   $SERVER_SYSTEMROOT/fonts/
//   MBTTF_DIR $SERVER_SYSTEMROOT/fonts/
//
//------------------------------------------------------------------------
//define('CACHE_DIR','cache/');
define('TTF_DIR','/usr/share/fonts/truetype/');
// define('MBTTF_DIR','/usr/share/fonts/truetype/');

//-------------------------------------------------------------------------
// Cache directory specification for use with CSIM graphs that are
// using the cache.
// The directory must be the filesysystem name as seen by PHP
// and the 'http' version must be the same directory but as
// seen by the HTTP server relative to the 'htdocs' ddirectory.
// If a relative path is specified it is taken to be relative from where
// the image script is executed.
// Note: The default setting is to create a subdirectory in the
// directory from where the image script is executed and store all files
// there. As ususal this directory must be writeable by the PHP process.
define('CSIMCACHE_DIR','csimcache/');
define('CSIMCACHE_HTTP_DIR','csimcache/');

//------------------------------------------------------------------------
// Various JpGraph Settings. Adjust accordingly to your
// preferences. Note that cache functionality is turned off by
// default (Enable by setting USE_CACHE to true)
//------------------------------------------------------------------------

// Deafult locale for error messages.
// This defaults to English = 'en'
define('DEFAULT_ERR_LOCALE','en');

// Deafult graphic format set to 'auto' which will automatically
// choose the best available format in the order png,gif,jpeg
// (The supported format depends on what your PHP installation supports)
define('DEFAULT_GFORMAT','auto');

// Should the cache be used at all? By setting this to false no
// files will be generated in the cache directory.
// The difference from READ_CACHE being that setting READ_CACHE to
// false will still create the image in the cache directory
// just not use it. By setting USE_CACHE=false no files will even
// be generated in the cache directory.
define('USE_CACHE',false);

// Should we try to find an image in the cache before generating it?
// Set this define to false to bypass the reading of the cache and always
// regenerate the image. Note that even if reading the cache is
// disabled the cached will still be updated with the newly generated
// image. Set also 'USE_CACHE' below.
define('READ_CACHE',true);

// Determine if the error handler should be image based or purely
// text based. Image based makes it easier since the script will
// always return an image even in case of errors.
define('USE_IMAGE_ERROR_HANDLER',true);

// Should the library examine the global php_errmsg string and convert
// any error in it to a graphical representation. This is handy for the
// occasions when, for example, header files cannot be found and this results
// in the graph not being created and just a 'red-cross' image would be seen.
// This should be turned off for a production site.
define('CATCH_PHPERRMSG',true);

// Determine if the library should also setup the default PHP
// error handler to generate a graphic error mesage. This is useful
// during development to be able to see the error message as an image
// instead as a 'red-cross' in a page where an image is expected.
define('INSTALL_PHP_ERR_HANDLER',false);

// Should usage of deprecated functions and parameters give a fatal error?
// (Useful to check if code is future proof.)
define('ERR_DEPRECATED',true);

// The builtin GD function imagettfbbox() fuction which calculates the bounding box for
// text using TTF fonts is buggy. By setting this define to true the library
// uses its own compensation for this bug. However this will give a
// slightly different visual apparance than not using this compensation.
// Enabling this compensation will in general give text a bit more space to more
// truly reflect the actual bounding box which is a bit larger than what the
// GD function thinks.
define('USE_LIBRARY_IMAGETTFBBOX',true);

//------------------------------------------------------------------------
// The following constants should rarely have to be changed !
//------------------------------------------------------------------------

// What group should the cached file belong to
// (Set to '' will give the default group for the 'PHP-user')
// Please note that the Apache user must be a member of the
// specified group since otherwise it is impossible for Apache
// to set the specified group.
define('CACHE_FILE_GROUP','www');

// What permissions should the cached file have
// (Set to '' will give the default persmissions for the 'PHP-user')
define('CACHE_FILE_MOD',0664);

// Default theme class name
define('DEFAULT_THEME_CLASS', 'UniversalTheme');

define('SUPERSAMPLING', true);
define('SUPERSAMPLING_SCALE', 1);

?>

If it makes any difference, I am running ISPConfig 3.0.5.3

Was it helpful?

Solution 2

So, after a lot more of testing and trial and error. I finally got an error code which pointed me in the right direction.

Warning: imagettftext(): open_basedir restriction in effect. File(/usr/share/fonts/truetype/arial.ttf) is not within the allowed path(s):

Then I had to do some reading and get an understanding of open_basedir. Now that I know that I had to find where I needed to enter the trutype directory in the config to allow the particular site access to that fonts directory.

Navigate to: ISPConfig-->Sites-->[click on domain]-->Options-->PHP open_base_dir and added :/usr/share/fonts/truetype to what was already there. Now JpGraph can read the font correctly.

I hope that this will be of help to others using ISPConfig with open_basedir configuration.

OTHER TIPS

just upload arial.ttf font file in your font folder jpgraph/fonts

thats it

I had the same problem but with another font. What I did is specifically define the path of the needed font (aka dejavu) in the jpg-config.inc.php and it worked.

I just added the next line:

define('TTF_DIR','/usr/share/fonts/truetype/ttf-dejavu/');

Hope it'll help. Cheers

If you are in a shared hosting, you should not have permission, or the fonts are in other path. You can copy the fonts in your project and modify the directory.

In jpgraph.php:

//
// Setup path for western/latin TTF fonts
//
if (!defined('TTF_DIR')) {
    if (strstr( PHP_OS, 'WIN') ) {
        $sroot = getenv('SystemRoot');
        if( empty($sroot) ) {
            $t = new ErrMsgText();
            $msg = $t->Get(12,$file,$lineno);
            die($msg);
        }
        else {
            define('TTF_DIR', $sroot.'/fonts/');
        }
    } else {
        //define('TTF_DIR','/usr/share/fonts/truetype/');
        **// YOUR FONTS:
        define('TTF_DIR', 'includes/jpgraph/src/fonts/');**
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top