Skip to content

Instantly share code, notes, and snippets.

@woodyhayday
Last active April 20, 2024 16:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save woodyhayday/f8dc36cc7ec922bc1894f33eb2b0e928 to your computer and use it in GitHub Desktop.
Save woodyhayday/f8dc36cc7ec922bc1894f33eb2b0e928 to your computer and use it in GitHub Desktop.
Install a .ttf font file into dompdf without using command line
<?php
/**
* Install a .ttf font file into dompdf without using command line
* Tested to pdfdom 0.8.2 - https://github.com/dompdf/dompdf
* Adapted from pdfdom utils - https://github.com/dompdf/utils - https://github.com/dompdf/utils/blob/master/load_font.php
*
* Steps to use:
* 1. Retrieve font you want to use as a .ttf (for language support including Cyrillic, Greek, Devanagari, Latin, and Vietnamese, we used Noto Sans with all optional languages checked)
* 2. Run/build in this script and fire PDFBuilder_install_font_family() ONCE only (singular install)
*
* Links:
* Noto Sans: https://fonts.google.com/specimen/Noto+Sans?selection.family=Noto+Sans
**/
#} Require dompdf
require_once('includes/dompdf/autoload.inc.php');
#} Initialise dompdf
$dompdf = new Dompdf\Dompdf();
#} Usage:
$fontName = 'Noto Sans';
$normalFile = 'NotoSans-Regular.ttf';
$boldFile = 'NotoSans-Bold.ttf';
$italicFile = 'NotoSans-Italic.ttf';
$boldItalicFile = 'NotoSans-BoldItalic.ttf';
PDFBuilder_install_font_family($dompdf, $fontName, $normalFile, $boldFile, $italicFile, $boldItalicFile);
/**
* Installs a new font family
* This function maps a font-family name to a font. It tries to locate the
* bold, italic, and bold italic versions of the font as well. Once the
* files are located, ttf versions of the font are copied to the fonts
* directory. Changes to the font lookup table are saved to the cache.
*
* This is an an adapted version of install_font_family() from https://github.com/dompdf/utils
*
* @param Dompdf $dompdf dompdf main object
* @param string $fontname the font-family name
* @param string $normal the filename of the normal face font subtype
* @param string $bold the filename of the bold face font subtype
* @param string $italic the filename of the italic face font subtype
* @param string $bold_italic the filename of the bold italic face font subtype
*
* @throws Exception
*/
function PDFBuilder_install_font_family($dompdf, $fontname, $normal, $bold = null, $italic = null, $bold_italic = null, $debug = false) {
try {
$fontMetrics = $dompdf->getFontMetrics();
// Check if the base filename is readable
if ( !is_readable($normal) )
throw new Exception("Unable to read '$normal'.");
$dir = dirname($normal);
$basename = basename($normal);
$last_dot = strrpos($basename, '.');
if ($last_dot !== false) {
$file = substr($basename, 0, $last_dot);
$ext = strtolower(substr($basename, $last_dot));
} else {
$file = $basename;
$ext = '';
}
if ( !in_array($ext, array(".ttf", ".otf")) ) {
throw new Exception("Unable to process fonts of type '$ext'.");
}
// Try $file_Bold.$ext etc.
$path = "$dir/$file";
$patterns = array(
"bold" => array("_Bold", "b", "B", "bd", "BD"),
"italic" => array("_Italic", "i", "I"),
"bold_italic" => array("_Bold_Italic", "bi", "BI", "ib", "IB"),
);
foreach ($patterns as $type => $_patterns) {
if ( !isset($$type) || !is_readable($$type) ) {
foreach($_patterns as $_pattern) {
if ( is_readable("$path$_pattern$ext") ) {
$$type = "$path$_pattern$ext";
break;
}
}
if ( is_null($$type) )
if ($debug) echo ("Unable to find $type face file.\n");
}
}
$fonts = compact("normal", "bold", "italic", "bold_italic");
$entry = array();
// Copy the files to the font directory.
foreach ($fonts as $var => $src) {
if ( is_null($src) ) {
$entry[$var] = $dompdf->getOptions()->get('fontDir') . '/' . mb_substr(basename($normal), 0, -4);
continue;
}
// Verify that the fonts exist and are readable
if ( !is_readable($src) )
throw new Exception("Requested font '$src' is not readable");
$dest = $dompdf->getOptions()->get('fontDir') . '/' . basename($src);
if ( !is_writeable(dirname($dest)) )
throw new Exception("Unable to write to destination '$dest'.");
if ($debug) echo "Copying $src to $dest...\n";
if ( !copy($src, $dest) )
throw new Exception("Unable to copy '$src' to '$dest'");
$entry_name = mb_substr($dest, 0, -4);
if ($debug) echo "Generating Adobe Font Metrics for $entry_name...\n";
$font_obj = Font::load($dest);
$font_obj->saveAdobeFontMetrics("$entry_name.ufm");
$font_obj->close();
$entry[$var] = $entry_name;
}
// Store the fonts in the lookup table
$fontMetrics->setFontFamily($fontname, $entry);
// Save the changes
$fontMetrics->saveFontFamilies();
// Fini
return true;
} catch (Exception $e){
// nada
}
return false;
}
@shri555
Copy link

shri555 commented Feb 6, 2021

Uncaught Error: Class 'Font' not found on line number 126.

@scorpion2763
Copy link

Uncaught Error: Class 'Font' not found on line number 126.

require_once('inc/dompdf/autoload.inc.php');

use Dompdf\Dompdf;
use FontLib\Font;

$dompdf = new Dompdf();

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment