How to Set Up External Fonts in TCPDF

How to Set Up External Fonts in TCPDF
php
Ethan Jackson

Environment

  • PHP 8.2
  • Laravel 9
  • docker-compose
  • Running on AWS cloud with docker platform

Issue Description

I'm developing a feature that uses TCPDF (+ FPDI) to write text on an existing PDF template. Since the template uses MS Mincho font, I wrote the following code to match it:

$pdf = new Fpdi(); ~~~ $tcpdfFonts = new TCPDF_FONTS(); $font = $tcpdfFonts->addTTFfont(resource_path('msmincho.ttf')); $pdf->SetFont($font, '', 12);

This worked fine on my local environment, but when deployed to AWS cloud, I got the following error:

ErrorException: fopen(file:///var/www/app/vendor/tecnickcom/tcpdf/fonts/msmincho.z): Failed to open stream: Permission denied in /var/www/app/vendor/tecnickcom/tcpdf/include/tcpdf_static.php:1839

Could you please advise how to resolve this error?

Answer

I found the solution myself, so I'm sharing it here.

The issue was that font files were being generated in the vendor directory under the TCPDF package, so I addressed this problem.
https://tcpdf.org/docs/srcdoc/TCPDF/classes-TCPDF-FONTS/#method_addTTFfont

$tcpdfFonts->addTTFfont( fontfile: resource_path('fonts/msmincho.ttf'), // Create the storage/app/tcpdf/fonts directory beforehand outpath: storage_path('app/tcpdf/fonts/') );

This resolved the original error log message, but then I encountered the following error:

<strong>TCPDF ERROR: </strong>Could not include font definition file: msmincho

It was necessary to load the generated font file with TCPDF::SetFont(). After reading the package source code, I finally modified the code as follows, which now works correctly:
https://tcpdf.org/docs/srcdoc/TCPDF/classes-TCPDF/#method_setFont

$fontName = 'msmincho'; $fontDir = storage_path('app/tcpdf/fonts/'); $tcpdfFonts = new TCPDF_FONTS(); $font = $tcpdfFonts->addTTFfont( fontfile: resource_path("fonts/{$fontName}.ttf"), outpath: $fontDir, ); $this->pdf->SetFont( family: $font, size: 12, fontfile: "{$fontDir}/{$fontName}.php" );

I'm also including a related answer that might be helpful:
TCPDF, "Could not include font definition file" with OpenType fonts

I hope this helps anyone facing similar issues with TCPDF font permissions in Docker/cloud environments!

Related Articles