UTF-8 problem (FontLib\\Table\\Type\\fftm not found)

183 views
Skip to first unread message

Tamás Bulyáki

unread,
Oct 25, 2020, 3:56:03 AM10/25/20
to dompdf
Hey,

I ran into this error and many others while was trying to generate pdf from a few different html inputs.

I'm on a blockly project and this is from where the html sources are coming.

I have to use UTF-8 output and when I try to use the builtin Dejavu fonts I got the errors below (with some cpdf debug message) and the pdf is not generated. I'm on windows and I have a linux server as well to test the results and got the same problem there - not counting that on linux there were more missing table type errors.

The only workaround I found yet is to force to use some already known table type by adding these to the File.php in php-font-lib/src/FontLib/TrueType:

I tried first to create manually these empty classes to avoid the error, but when I figured out all the missing classes and it worked finally on windows it turned out that on linux were more other missing classes - so I gave up and simply ignored all the unknown types.

What do I miss - I have a feeling that I'm doing something wrong - but there are simply no matches when I try to google it for this kind of error.

Thanks in advance for any input an help!


[Sun Oct 25 08:14:56.449926 2020] [php7:notice] [pid 26780:tid 1820] [client ::1:50646] selectFont: selecting - C:\\xampp\\htdocs\\snap\\SNAP\\vendor\\dompdf/lib/fonts/DejaVuSerif - , 1\nopenFont: C:\\xampp\\htdocs\\snap\\SNAP\\vendor\\dompdf/lib/fonts/DejaVuSerif - DejaVuSerif\nmetrics: DejaVuSerif.ufm, cache: DejaVuSerif.ufm.php\nopenFont: php file exists C:\\xampp\\htdocs\\snap\\SNAP\\vendor\\dompdf/lib/fonts/DejaVuSerif.ufm.php\nselectFont: selecting - C:\\xampp\\htdocs\\snap\\SNAP\\vendor\\dompdf/lib/fonts/DejaVuSerif-Bold - , 1\nopenFont: C:\\xampp\\htdocs\\snap\\SNAP\\vendor\\dompdf/lib/fonts/DejaVuSerif-Bold - DejaVuSerif-Bold\nmetrics: DejaVuSerif-Bold.ufm, cache: DejaVuSerif-Bold.ufm.php\nopenFont: php file exists C:\\xampp\\htdocs\\snap\\SNAP\\vendor\\dompdf/lib/fonts/DejaVuSerif-Bold.ufm.php\nselectFont: checking for - C:\\xampp\\htdocs\\snap\\SNAP\\vendor\\dompdf/lib/fonts/DejaVuSerif.ttf\n, referer: https://localhost/snap/SNAP/snut/get_page.php?page_id=7357852355104343&panel=M
[Sun Oct 25 08:14:56.455779 2020] [php7:notice] [pid 26780:tid 1820] [client ::1:50646] [snap] [error FontLib\\Table\\Type\\fftm not found] [pid 26780] [url /snap/SNAP/repo03/mapper/process.php] [username nev****ind] [userid 7595783275122354] [pageid -] [pagename -] [processid 7377862355104091] [details {"class":"RuntimeException"}] [stack [{"function":"{closure}","args":["FontLib\\\\Table\\\\Type\\\\fftm"]},\r\n{"function":"spl_autoload_call","args":["FontLib\\\\Table\\\\Type\\\\fftm"]},\r\n{"file":"C:\\\\xampp\\\\htdocs\\\\snap\\\\SNAP\\\\vendor\\\\dompdf\\\\lib\\\\php-font-lib\\\\src\\\\FontLib\\\\TrueType\\\\File.php","line":312,"function":"class_exists","args":["FontLib\\\\Table\\\\Type\\\\fftm"]},\r\n{"file":"C:\\\\xampp\\\\htdocs\\\\snap\\\\SNAP\\\\vendor\\\\dompdf\\\\lib\\\\php-font-lib\\\\src\\\\FontLib\\\\TrueType\\\\File.php","line":124,"function":"readTable","class":"FontLib\\\\TrueType\\\\File","type":"->","args":["FFTM"]},\r\n{"file":"C:\\\\xampp\\\\htdocs\\\\snap\\\\SNAP\\\\vendor\\\\dompdf\\\\lib\\\\Cpdf.php","line":1170,"function":"parse","class":"FontLib\\\\TrueType\\\\File","type":"->","args":[]},\r\n{"file":"C:\\\\xampp\\\\htdocs\\\\snap\\\\SNAP\\\\vendor\\\\dompdf\\\\lib\\\\Cpdf.php","line":931,"function":"processFont","class":"Dompdf\\\\Cpdf","type":"->","args":[8,{"name":"DejaVuSerif","fontFileName":"C:\\\\xampp\\\\htdocs\\\\snap\\\\SNAP\\\\vendor\\\\dompdf\\/lib\\/fonts\\/DejaVuSerif","SubType":"Type1","isSubsetting":true,"fontNum":1,"encoding":"WinAnsiEncoding","toUnicode":9,"cidFont":10}]},\r\n{"file":"C:\\\\xampp\\\\htdocs\\\\snap\\\\SNAP\\\\vendor\\\\dompdf\\\\lib\\\\Cpdf.php","line":3198,"function":"o_font","class":"Dompdf\\\\Cpdf","type":"->","args":[8,"add"]},\r\n{"file":"C:\\\\xampp\\\\htdocs\\\\snap\\\\SNAP\\\\vendor\\\\dompdf\\\\src\\\\Adapter\\\\CPDF.php","line":1213,"function":"output","class":"Dompdf\\\\Cpdf","type":"->","args":[false]},\r\n{"file":"C:\\\\xampp\\\\htdocs\\\\snap\\\\SNAP\\\\vendor\\\\dompdf\\\\src\\\\Dompdf.php","line":932,"function":"output","class":"Dompdf\\\\Adapter\\\\CPDF","type":"->","args":[{"compress":true}]},\r\n{"file":"C:\\\\xampp\\\\htdocs\\\\snap\\\\SNAP\\\\repo03\\\\report_utils.php","line":182,"function":"output","class":"Dompdf\\\\Dompdf","type":"->","args":[]},\r\n{"file":"C:\\\\xampp\\\\htdocs\\\\snap\\\\SNAP\\\\repo03\\\\mapper\\\\process.php(66) : eval()'d code","line":8,"function":"PDFwithAttachment","args":["<style>\\r\\n        input[type=text]:before { border: 1px solid #FFF; }\\r\\n        label { display: block; padding-bottom: 2px; }\\r\\n        <\\/style>\\r\\n        <html> <head> <title><\\/title> <\\/head> <body> <h3>Tervez&eacute;s &gt; M\\u0171k&ouml;d&eacute;s&nbsp;&gt;&nbsp;Blockly language&nbsp;<\\/h3>  <h1>Frames<\\/h1>  <p>Eml&eacute;keztet\\u0151&uuml;l: a b&ouml;ng&eacute;sz\\u0151 ablakot a SNAP keretekre &ndash; frame &ndash; osztja fel: top, left, middle, right, bottom.<\\/p>  <p>A keretekkel v&eacute;gezhet\\u0151 m\\u0171veletek blokkjait a Event Blocks \\/ Frames men&uuml;ben tal&aacute;ljuk.<\\/p>  <p>&nbsp;<\\/p>  <p><img src=\\"data:image\\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQcAAACDCAYAAACA\\/d7dAAAgAElEQVR4Ae2dB3hdxZn3f6fcqqsuWb1a7sYNF8DYQHAgkJAEvpCyy6aQwkJINiTf5kuyZJNNNgEWNgWWtoA3WcKmUJZAEorp7ja4V7lIlqxiq1\\/p9lO+Z86VbBnLsuxILtLc59Gjc0+Zeec3c\\/7zzjtzzlVs27aRH0lAEpAE3kdAfd93+VUSkAQkAYeAFAfZECQBSWBAAlIcBsQid0oCkoAUB9kGJAFJYEACUhwGxCJ3SgKSgBQH2QYkAUlgQAJSHAbEIndKApKAFAfZBiQBSWBAAlIcBsQid0oCkoAUB9kGJAFJYEAC+oB7T7RTrLRWeg8620PVFrlC+0RI5X5JYOQI9N2sp5fD4OJgmxBcA9F9ENsPZgSU3gzFMTUVcj8F\\/kknyN2GthehawWoQxWSEyQld0sCksDQCFjiNBXyPg0pM4Z2zQBnnVgcIvuh4UHoeQnsHjBSsO2jN7gjEXoYul6HvK\\/AuE+B0i+52AFoeBiCL4CZwDbcR72OAQyRuyQBSWB4CCi2AYoGGYtGQByi+2Hv1yCxg+72Mur3XUZXazamKW5+MURQsC2FwopaKqetR2n6EXSvhvwvgSsbguvg0GNgVBPqLGb3hvmEgmkoqjk8pZepSAKSwHEEROetKBaTZ79LTknjsZ31cWeffEe\\/rr73ZCsGBx8AYweNNXNYu+xqOltyUTUTRTkaO7AtldpdU2isqWDa3GVkZD2H2vkWaJkQr8dW3dTtvYjNyxfRfjgPRbWOuf7kpp1PZwixtDETJufKE\\/DCs1M0FU1Xh+ixKVimhWVYg5ZBURQ0l4aiihyOtofhqy3Fyd9KWFiW4x8PX9IjlNLIMxma4bapoWgmRZV7ySk7OLSLBjnreHEIb4fQ647HsP61q+hszcHjiwyYhBCIPVsm48qeyazKPXhTOsCysVWNzX9ysfWtSmzVg9sbHfD643baFpaZbNR9oY3jzjnJDtG4URVUp\\/Ge5ORhOixuKt2nk16Uju7ROdtvyBDshEiFWkOEWkKoQiBO8hFl8KV6SC3IcG7+gcog0k1EEwQbghgJ8xjGtmlho6BqvTGp9+UnxFPEq05Wr4642pBanIYvw5uUnxNqkI2iqGiaimUYWE60POnZarqOaEymIzBJIVMUDV1VMC0bTVUxrYRoro4n\\/D5zh\\/zVYRJO0NXQ5Qir0r\\/8tp0UW8FFF736kJM9rRNt0YGrFuoweejHi0NkDxg97N9+BR0tuXgGubEdb8COUnr5B\\/BO\\/diRAgnedk41noytxLrCgHbk2Ak3RNvRPPjSFBLhGKZx8oZ0XFqKgjfThx1JkEhYQ+wxj0vllHaIRu\\/yuqhYVEHOhBxUTR2ZDvVUrOpthNHOKPuW76O9ph1NP3EdCGHwpnupuryK9OL0pFcw0A2p4DT2lt0t1KyswYyLxgi2peHLTkVTw4TaxHi3310ghEoItqKga+KGHMQbcBoOFFxQQMm8Elx+V7LUA9kijigKdiJMW3uYtNwcPKrtCLOwKdYTxNL9eD0uoZRJm8wowbiB3+Uikojj86Ti6r3mVPAec66Cw6F5RzN1q+sc78vxqkSeKvjGZeD1WoRbeognTqNNH5PZqX45EbihpXN8lxKtBstDuDsNVR2kInvTF+3Aih\\/rGdhxk4xCF1VXVODP8g\\/JPRTK786aypXfmUNufgIjZmMlTMdVN0Xj6v0c2Zcwscxk4UWvZUTiWG4P87+zhJmT07EiRm+vI9S7Nx2RnnCbRVpC1fvS70tLNGTLSubpHLOwe7O2j6Qh3O4+a8T5NlkVWeROyMU2bYyogZWwwQDV0tBsFTtukIgaGHEb1Rb7NEiYzj7LsEFM\\/Dj7VSxxbiwhYrhH9onrjdhAf\\/3KJeztO0fkFTWcG754djFuv9ux86jVx24Ju4X9mWWZDisjYmAZgGBliBvQSuYfNRyPJHdSLpml4lwBR3DUyKgspmCy9wjTI2zjJrjdTPnUTCqyvZgxC\\/oxdjyKXnPEtifNQ+GsQnSv7pRBnK8Ib\\/IISxPhsToMDYh3NrNp7VbaQwZ2QvB1k+JTWPn4D3juzR2ADoaKW0+HxuX86OmH2bF7FT\\/9\\/b+zqx00w0bprRPF6C1nH8d+\\/4UQimGj8xc3j9ZH1EAMK\\/Kn5pNWlHaEsxE2SSmfxBXfn8vES3Jw66IN9La\\/3iFoX3pCL49td6KM1lGWAvP72qaVdHmOrchh\\/na852CJIUSv8veLMQwlX9EgRaWqLpW8aXnkX5CPL93H2ifWOg30pGkoGi6fhmJbxA2bzJJM\\/B6FWHs33Z0JMVrAm5eOP1XHiiWItPUQDRnoKT5SC9LRAx5cXp1En2sn7mJdx5PqQvPoePw6iY5ueoIxTEXHPy4Tf6qGHYvT0xomJtLy+cgq9WHHE8SdmyxOJGjgzksnM8OFFY7Q2RgGXTvSQXpSPc5NI1xiQS4aC2NYJu0tB4jYWYwvLsLlVvFYMfZU76BH8VFaMYEsV4zO7hCqHaehuRHLn8H44hJcItKcaGf3rgPEtQwmVJbhsRMk3tcgbMvAEB21kHghlJqG1m84JW5et8+N5tZIhBO9cYJja0HYLFxeT8DjNGwhhiL77tYmCGSghDtRU7JJcetOry+ERPNqR84XXqHmTnB4SzUtmLhSvc7QSvd70TWDntpOfFWFTLp6Es01jbgaOohrATKLU1CVBMGD3U4ZND0ZaxB2CO8rKTwKphGlO2oQaquny0qnanwJoZqdNCVUKsrH400t5pLL83F5NDQzxoH9u4llegnHhMAZ6C4P4Y7t7Kq18YS7Mew4pmkQiUcxFBd+T5zq6u20xixyiidTmqIREh5RP+dHCKCRMLDFsEjgE06BqP9elI7AKeAOuJN7TAsyUym4chK+nhp2vy7aQYCMci8u4nQ1hwkUZ+LxqpjhGKGWHmyPB69Xx+X3oFlxOhvjpJSk4rIThNqDxCI2quIhoywVTbEIH+wiYljJmNKxVTps344XB+ELDfEjKtCIJ5VTXNKypwWXz0VOVY7jMYh9\\/mz\\/ETU9ebKiF7KwFSj8+DzmXuqnoxnGFem8+9AK4nlFXPLRCbRsPox3YjGp4T28sbSGiV9ZTJHaSVtKLjkBnf2iNxafhIFRUMgl\\/3gJeR2dHKrvJn2yh20\\/WUFr8XQWfj6T1vfacU0tx9e0hxWPHOSCmxeR6gmi6unkTVXY9sSf2BusZNaHKrFqOglMyOXwhs1sfbUZvXcs3zdOFqLqdeusf\\/0XPLy5h1n5Xuq211By9a18Z8lknnvmFyyvDuOxWuip+Aj\\/9sVrWLv0l\\/yxSaMiPc7O+loW\\/Z+f8vkLNV56ZilrOtwoXUEyJn+Em6+fh8+KCyfD+ShizBztonZdHeGgjZLmp3R+BZkpLse17T3NEa2kq9S3Z+D\\/ThmSKTsC27z5Rf68L4PZhYdZ1TKJb37lOryxHkeDRHpHzzeJ9wSY9eXLyFKWs7+pjAWfrKB5axO2UkhKaB+1LW4U0yZjWjb+tihV18yjxN1F2MhHixxgxePbONIT9ktbd\\/tp2fY833r6FSYV5BNsaIP8ecxSW9ncuInMmV\\/jtkU+HnvoHW747m20vvUfLF3ZSmGJQlP1Hi6en4XZtoP7H\\/pX2vylEK6l2j8Vr0vEKVz41Tir3nqBF1Zswh2I05A2nq9+9O+YHFCJihtcfEQAVjVpqa6lcU\\/IUeL0aaWUV2aiOHGW5GkO495mJzxZvTSL3MkuVCubimtnkDujHC16iIZVzeQuzqKqPEDT7hA5FxUTXr6Sg4li5n2ykuath1By0zBrI1idPfhm5GDv3sKKR4NM+MIccvMihA0vmeEgG3+1kRYnftInU722DNO\\/AZSgn888SCbiJi5dUMrcm+Y6qnp492ESkYQzvm3b13bkymQPcOTrSTcs08SVXcnFHyml8Y\\/rePvet6nv9DL3wxNRa1tY8chKNj6\\/nQPbDuMrGc\\/0RfMpLoyy8oHlrFu6iShiXNcPlqbjC0DLe+t4\\/Z5V7NvhZfpnZ6I11\\/Huz1ex5YWd1C7vJmdyGlW3TaEko5sN97zOW8\\/vJ6zo6Fom06+9gPSuGna+uIOde6NM+\\/Q8Knwqxvt6cqdwqkKis5NYooJv3PEwd33xCrbt38aG937PHxoifON7D\\/LI979H+s71vLCxGcNoRM2Zyj\\/96GG+86HL2LN8Fas3v8nTtT5uvOGzfO76i9m9\\/D5e2t2Kz300biBuTndKgIAXuqq7wBMgEHA5LvtJIQ96gk08YjH9ys9QoGyg2lWFL\\/I2\\/7NqIy7dc6S3fH8SmktHc4Pmd6PH4ux+8G3WP7OVlNmlBOubCXZEqHm6Gu\\/EyUwqN1nxs3d4a+lm9AsmMmNiarJTeH+iioIZ6aanI5+bbn2Yf73pUjr2b2D2l+7l7ps\\/z871uzgUjyHW47XvXc2v11nceuf93H\\/LP1CephHXo6x+9gns4i9y\\/48e4uuXz0IJxbER3pKPeMtqnlv1ChOv\\/Cw33\\/g5JhxcwdJnlmN4fY6X6pgjhp+4Sc8NYDUH6elQSMsJoDmpvN\\/g5HdF10hsr2f\\/th5C+\\/axb0U93iwPh598j\\/XP7uXwu3WseHQtW\\/+8k0MHo+ROLCcjxY3a3s2O+95hy8s9lF7sofr3K1izro2MgnJKLh9P1QIf9X\\/ewfYXa9DnTmfGpyowY33dxcC2\\/DV7B\\/AchpacACy8BF+mzzEw3hN3xtxCQcXwQjTeY27SoSXrnOVy5aCEmmlp6EJPKOyrbqe80IvftFEWTWXeNA+RToV4yCbNn4l1+F26ggoq7XR2xo5djCliIsEI7U1BTD1OR\\/UB+FgZilZP9qz5zJ7rpqvW5TTC\\/IoUou+2Yhgmsd0ddO0NQ54YerhR9EwmfiYHlB72v9xKNBljOz74aJqYqdmMnzENX6yTsJZOuqebxuZqZlbOY5


Here are my dompdf settings, actually the whole function:

function PDFwithAttachment($aPDFcontent, $aPDFattachments) {
//set dompdf options
$options = new Options();
$options->set('defaultFont', 'dejavu serif, serif');
$options->setIsHtml5ParserEnabled('true');
$dompdf = new Dompdf($options);

//setup the paper size and orientation (optional)
$dompdf->setPaper('A4', 'portrait');

//add custom css
//input type text related customization is needed to handle correctly form inputs and their labels
$customCSS = "<style>
input[type=text]:before { border: 1px solid #FFF; }
label { display: block; padding-bottom: 2px; }
</style>
";

$aPDFcontent = $customCSS . $aPDFcontent;

$dompdf->loadHtml($aPDFcontent, 'UTF-8');
//Render the HTML as PDF
$dompdf->render();

//Handling attachments
$attachments = [];
$pdfAttachments = [];

if(!empty($aPDFattachments)) {
if (isset($aPDFattachments['attachment_content'])) {
$attachments[0] = $aPDFattachments;
} else {
$attachments = $aPDFattachments;
}

$i = 0;
foreach ($attachments as $attachment) {
$tmpfname = tempnam(sys_get_temp_dir(), 'pdf');

$handle = fopen($tmpfname, "w");
fwrite($handle, $attachment['attachment_content'] ?? '');
fclose($handle);

$i++;
$pdfAttachments[] = [
'name' => $attachment['attachment_name'] ?? 'attachment_' . $i . '.xml',
'mime' => 'text/xml',
'description' => $attachment['attachment_description'] ?? '',
'AFRelationship' => 'Alternative',
'path' => $tmpfname
];
}
}

/** @var Cpdf $cpdf */
$cpdf = $dompdf->getCanvas()->get_cpdf();

foreach ($pdfAttachments as $attachment) {
$cpdf->addEmbeddedFile(
$attachment['path'],
$attachment['name'],
$attachment['description']
);
}

//Output the generated PDF as String
return $dompdf->output();
}

Tamás Bulyáki

unread,
Oct 25, 2020, 3:57:32 AM10/25/20
to dompdf
For some reason the workaround image had been trimmed out, so here it is again:


function parse() {
$this->parseTableEntries();

$this->data = array();

foreach ($this->directory as $tag => $table) {
if (empty($this->data[$tag])) {
if (!in_array($tag,array("head", "hhea", "cmap", "hmtx", "maxp", "glyf", "loca", "name", "post"))){
$tag = 'CMAP';
}
$this->readTable($tag);
}
}
}

Reply all
Reply to author
Forward
0 new messages