From e91747785b1950598812348ce9b8da89c7da9e22 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Mon, 20 Apr 2026 15:42:28 +0100 Subject: [PATCH 1/3] PDF: Started building system to allow custom DOMPDF font loading --- app/Config/exports.php | 4 +-- app/Exports/PdfGenerator.php | 47 +++++++++++++++++++++++++++ storage/fonts/.gitignore | 6 +++- storage/fonts/dompdf/.gitignore | 3 ++ storage/fonts/dompdf/cache/.gitignore | 2 ++ 5 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 storage/fonts/dompdf/.gitignore create mode 100644 storage/fonts/dompdf/cache/.gitignore diff --git a/app/Config/exports.php b/app/Config/exports.php index 2e22bc759e3..f48fe0a67a3 100644 --- a/app/Config/exports.php +++ b/app/Config/exports.php @@ -68,7 +68,7 @@ * Times-Roman, Times-Bold, Times-BoldItalic, Times-Italic, * Symbol, ZapfDingbats. */ - 'font_dir' => storage_path('fonts/'), // advised by dompdf (https://github.com/dompdf/dompdf/pull/782) + 'font_dir' => storage_path('fonts/dompdf'), // advised by dompdf (https://github.com/dompdf/dompdf/pull/782) /** * The location of the DOMPDF font cache directory. @@ -78,7 +78,7 @@ * * Note: This directory must exist and be writable by the webserver process. */ - 'font_cache' => storage_path('fonts/'), + 'font_cache' => storage_path('fonts/dompdf/cache'), /** * The location of a temporary directory. diff --git a/app/Exports/PdfGenerator.php b/app/Exports/PdfGenerator.php index f31d8aad078..df40bf44f81 100644 --- a/app/Exports/PdfGenerator.php +++ b/app/Exports/PdfGenerator.php @@ -4,6 +4,8 @@ use BookStack\Exceptions\PdfExportException; use Dompdf\Dompdf; +use FontLib\Font; +use Illuminate\Support\Str; use Knp\Snappy\Pdf as SnappyPdf; use Symfony\Component\Process\Exception\ProcessTimedOutException; use Symfony\Component\Process\Process; @@ -60,12 +62,57 @@ protected function renderUsingDomPdf(string $html): string $domPdf = new Dompdf($options); $domPdf->setBasePath(base_path('public')); + $fontMetrics = $domPdf->getFontMetrics(); + $userFontfamilies = $this->getUserDomPdfFontFamilies(); + foreach ($userFontfamilies as $fontFamily => $fonts) { + $fontMetrics->setFontFamily($fontFamily, $fonts); + } + +// dd($userFontfamilies, $fontMetrics->getFontFamilies()); $domPdf->loadHTML($this->convertEntities($html)); $domPdf->render(); return (string) $domPdf->output(); } + /** + * @return array> + */ + protected function getUserDomPdfFontFamilies(): array + { + $fontStore = storage_path('fonts/dompdf'); + if (!is_dir($fontStore)) { + return []; + } + + $fontFamilies = []; + $fontFiles = glob($fontStore . DIRECTORY_SEPARATOR . '*.ttf'); + foreach ($fontFiles as $fontFile) { + $fontFileName = basename($fontFile, '.ttf'); + $expectedUfm = $fontStore . DIRECTORY_SEPARATOR . $fontFileName . '.ufm'; + if (!file_exists($expectedUfm)) { + $font = Font::load($fontFile); + $font->parse(); + $font->saveAdobeFontMetrics($expectedUfm); + } + + $nameParts = explode('-', $fontFileName); + if (count($nameParts) === 1 || $nameParts[1] === 'Regular') { + $nameParts[1] = 'Normal'; + } + + $family = trim(strtolower(preg_replace('/([A-Z])/', ' $1', $nameParts[0]))); + $variation = Str::snake($nameParts[1]); + if (!isset($fontFamilies[$family])) { + $fontFamilies[$family] = []; + } + + $fontFamilies[$family][$variation] = $fontStore . DIRECTORY_SEPARATOR . $fontFileName; + } + + return $fontFamilies; + } + /** * @throws PdfExportException */ diff --git a/storage/fonts/.gitignore b/storage/fonts/.gitignore index c96a04f008e..cb0b47dace2 100755 --- a/storage/fonts/.gitignore +++ b/storage/fonts/.gitignore @@ -1,2 +1,6 @@ +# Font cache files have once been stored directly in this folder +# therefore its important the contents non-ignored by git +# are chosen selectively * -!.gitignore \ No newline at end of file +!.gitignore +!dompdf/ \ No newline at end of file diff --git a/storage/fonts/dompdf/.gitignore b/storage/fonts/dompdf/.gitignore new file mode 100644 index 00000000000..23ef65311b4 --- /dev/null +++ b/storage/fonts/dompdf/.gitignore @@ -0,0 +1,3 @@ +* +!.gitignore +!cache/ \ No newline at end of file diff --git a/storage/fonts/dompdf/cache/.gitignore b/storage/fonts/dompdf/cache/.gitignore new file mode 100644 index 00000000000..c96a04f008e --- /dev/null +++ b/storage/fonts/dompdf/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file From 241563e8fc272e9e12553462a72238d751ffe179 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Wed, 22 Apr 2026 13:12:34 +0100 Subject: [PATCH 2/3] Exports: Added testing coverage for DOMPDF font usage --- app/Exports/PdfGenerator.php | 1 - tests/Exports/PdfExportTest.php | 33 +++++++++++++++++++++++++ tests/test-data/fonts/Cardiff-Bold.ttf | Bin 0 -> 66940 bytes tests/test-data/fonts/Cardiff.ttf | Bin 0 -> 67984 bytes tests/test-data/fonts/attribution.txt | 2 ++ 5 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tests/test-data/fonts/Cardiff-Bold.ttf create mode 100644 tests/test-data/fonts/Cardiff.ttf create mode 100644 tests/test-data/fonts/attribution.txt diff --git a/app/Exports/PdfGenerator.php b/app/Exports/PdfGenerator.php index df40bf44f81..10f0624cfb3 100644 --- a/app/Exports/PdfGenerator.php +++ b/app/Exports/PdfGenerator.php @@ -68,7 +68,6 @@ protected function renderUsingDomPdf(string $html): string $fontMetrics->setFontFamily($fontFamily, $fonts); } -// dd($userFontfamilies, $fontMetrics->getFontFamilies()); $domPdf->loadHTML($this->convertEntities($html)); $domPdf->render(); diff --git a/tests/Exports/PdfExportTest.php b/tests/Exports/PdfExportTest.php index f311f8457db..78da3b0c2cc 100644 --- a/tests/Exports/PdfExportTest.php +++ b/tests/Exports/PdfExportTest.php @@ -79,6 +79,39 @@ public function test_page_pdf_export_opens_details_blocks() $this->assertStringContainsString('
entities->page()->forceFill([ + 'html' => '

Boldtext

', + ]); + $page->save(); + $this->setSettings([ + 'app-custom-head' => '' + ]); + $normalFont = $this->files->testFilePath('fonts/Cardiff.ttf'); + $normalFontTarget = storage_path('fonts/dompdf/MeowWords.ttf'); + $boldFont = $this->files->testFilePath('fonts/Cardiff-Bold.ttf'); + $boldFontTarget = storage_path('fonts/dompdf/MeowWords-Bold.ttf'); + copy($normalFont, $normalFontTarget); + copy($boldFont, $boldFontTarget); + + $resp = $this->asEditor()->get($page->getUrl('/export/pdf')); + $resp->assertStatus(200); + + // Existance of UFM files indicates the metrics have been generated + $this->assertFileExists(storage_path('fonts/dompdf/MeowWords.ufm')); + $this->assertFileExists(storage_path('fonts/dompdf/MeowWords-Bold.ufm')); + // Existence of cache json files indicates the fonts have been used + $this->assertFileExists(storage_path('fonts/dompdf/cache/MeowWords.ufm.json')); + $this->assertFileExists(storage_path('fonts/dompdf/cache/MeowWords-Bold.ufm.json')); + + $filesToCleanUp = [...glob(storage_path('fonts/dompdf/Meow*')), ...glob(storage_path('fonts/dompdf/cache/Meow*'))]; + foreach ($filesToCleanUp as $file) { + unlink($file); + } + } + public function test_wkhtmltopdf_only_used_when_allow_untrusted_is_true() { $page = $this->entities->page(); diff --git a/tests/test-data/fonts/Cardiff-Bold.ttf b/tests/test-data/fonts/Cardiff-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..efaae4d9eb03a58d47a8f096ee53c1fb8c918664 GIT binary patch literal 66940 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 T)!tky7+*wA1H^|--Q)iNX_HIK literal 0 HcmV?d00001 diff --git a/tests/test-data/fonts/Cardiff.ttf b/tests/test-data/fonts/Cardiff.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4e8fea609c6b15e512542d46f8d7f53dcbb32c99 GIT binary patch literal 67984 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 h`ue*swe Date: Wed, 22 Apr 2026 13:22:20 +0100 Subject: [PATCH 3/3] Exports: Improved dompdf font loading permission errors --- app/Exports/PdfGenerator.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/app/Exports/PdfGenerator.php b/app/Exports/PdfGenerator.php index 10f0624cfb3..5506fe74065 100644 --- a/app/Exports/PdfGenerator.php +++ b/app/Exports/PdfGenerator.php @@ -65,7 +65,12 @@ protected function renderUsingDomPdf(string $html): string $fontMetrics = $domPdf->getFontMetrics(); $userFontfamilies = $this->getUserDomPdfFontFamilies(); foreach ($userFontfamilies as $fontFamily => $fonts) { - $fontMetrics->setFontFamily($fontFamily, $fonts); + try { + $fontMetrics->setFontFamily($fontFamily, $fonts); + } catch (\Exception $exception) { + $expectedPath = storage_path('fonts/dompdf'); + throw new PdfExportException("Failed to create required font data in {$expectedPath}, Ensure all content in this location is writable by the web server"); + } } $domPdf->loadHTML($this->convertEntities($html)); @@ -92,7 +97,11 @@ protected function getUserDomPdfFontFamilies(): array if (!file_exists($expectedUfm)) { $font = Font::load($fontFile); $font->parse(); - $font->saveAdobeFontMetrics($expectedUfm); + try { + $font->saveAdobeFontMetrics($expectedUfm); + } catch (\Exception $exception) { + throw new PdfExportException("Failed to create required font data at $expectedUfm, Ensure this location is writable by the web server"); + } } $nameParts = explode('-', $fontFileName);