Last active
July 20, 2024 05:11
-
-
Save woodyhayday/f8dc36cc7ec922bc1894f33eb2b0e928 to your computer and use it in GitHub Desktop.
Install a .ttf font file into dompdf without using command line
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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; | |
} |
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
Uncaught Error: Class 'Font' not found on line number 126.