DOMpdf failing to render certain accented characters

Posted on Thu 21 August 2014 in Tech

I've noticed some issues with DOMpdf when trying to generate PDFs using their internal Helvetica font. After banging my head against a wall for a few hours trying to "fix" UTF-8 support, it turned out UTF-8 support was working fine. Essentially DOMpdf's internal Helvetica font didn't support a few polish characters. Specifically the Sacute, sacute and a few others like this. This was a bit of a killer problem for my requirements so I needed a work-around. My workaround was to use Arial fonts(they were close enough), but if you really need Helvetica you could source a copy of the .ttfs and replicate these steps.

Download Arial fonts

wget http://www.drivehq.com/file/df.aspx/shareID2129391/fileID59377155/arial.ttf wget http://www.911fonts.com/fonts/6/0/5/605.ttf -O arialit.ttf wget http://4nts.com/fonts/arialbd.ttf wget http://www.911fonts.com/fonts/6/0/4/604.ttf -O arialbit.ttf

This downloads arial, arial-bold, arial-oblique and arial-boldoblique.

Generate compatible dompdf files

Pull up a terminal and cd into your dompdf folder. If you're using composer, it'll be /vendor/dompdf/dompdf

php load_font.php arial ~/arial.ttf ~/arialbd.ttf ~/arialit.ttf ~/arialbit.ttf

You should now see an entry in lib/fonts/dompdf_font_family_cache.php

arial' =>
 array (
 'normal' => DOMPDF_FONT_DIR . 'arial',
 'bold' => DOMPDF_FONT_DIR . 'arialbd',
 'italic' => DOMPDF_FONT_DIR . 'arialit',
 'bold_italic' => DOMPDF_FONT_DIR . 'arialbit',
 ),

You can now reference the Arial font-family in your DOMpdf stylesheets and have it render some nice Helvetica like fonts.

If you are using composer with DOMpdf, I would highly recommend not leaving your custom fonts in DOMpdfs vendor folder. Copy the fonts directory somewhere in your projects directory, and over-ride this variable with your own def, referencing the new folder location.

def("DOMPDF_FONT_DIR", DOMPDF_DIR . "/lib/fonts/");

This means you shouldn't need to rely on dodgy customisations to the vendor folder.