From c5c1194950656ecab585657ac54b8839aef50bd7 Mon Sep 17 00:00:00 2001 From: Maximilian Kresse <545671+MaximilianKresse@users.noreply.github.com> Date: Tue, 30 Sep 2025 16:01:04 +0200 Subject: [PATCH] Fixed #39 usage of subset fonts in footer --- src/Modules/Document.php | 7 +++++ src/SetaFpdf.php | 6 ----- tests/visual/SetaFpdf/Special/FooterTest.php | 25 ++++++++++++++++++ .../FooterWithCustomFontExpectedResult.pdf | Bin 0 -> 5757 bytes 4 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 tests/visual/SetaFpdf/Special/FooterWithCustomFontExpectedResult.pdf diff --git a/src/Modules/Document.php b/src/Modules/Document.php index 861662c..8a8f958 100644 --- a/src/Modules/Document.php +++ b/src/Modules/Document.php @@ -13,6 +13,7 @@ use setasign\SetaFpdf\Position\Converter; use setasign\SetaFpdf\SetaFpdf; use setasign\SetaFpdf\StateBuffer\StateBufferInterface; +use setasign\SetaPDF2\Core\Font\TrueType\Subset; class Document implements StateBufferInterface { @@ -489,6 +490,12 @@ public function output($destination, $name, ?array $displayMode = null) \call_user_func($this->footerCallable); $this->pageBreakDisabled = false; + foreach ($this->manager->getFont()->getUsedFonts() as $font) { + if ($font instanceof Subset) { + $font->createSubset(); + } + } + self::applyDisplayMode($this->document, $displayMode); $info = $this->document->getInfo(); $info->setProducer('SetaFPDF ' . SetaFpdf::VERSION); diff --git a/src/SetaFpdf.php b/src/SetaFpdf.php index 7d71128..478bda9 100644 --- a/src/SetaFpdf.php +++ b/src/SetaFpdf.php @@ -460,12 +460,6 @@ public function Output($dest = '', $name = '') $name = 'doc.pdf'; } - foreach ($this->manager->getFont()->getUsedFonts() as $font) { - if ($font instanceof Subset) { - $font->createSubset(); - } - } - return $this->manager->getDocument()->output($dest, $name, $this->displayMode); } diff --git a/tests/visual/SetaFpdf/Special/FooterTest.php b/tests/visual/SetaFpdf/Special/FooterTest.php index 13f717d..56fc502 100644 --- a/tests/visual/SetaFpdf/Special/FooterTest.php +++ b/tests/visual/SetaFpdf/Special/FooterTest.php @@ -2,6 +2,7 @@ namespace setasign\tests\visual\SetaFpdf\Special; +use setasign\SetaFpdf\SetaFpdf; use setasign\tests\TestProxy; use setasign\tests\visual\SetaFpdf\Special\Footer\FPDFCustom; use setasign\tests\visual\SetaFpdf\Special\Footer\SetaFpdfCustom; @@ -38,4 +39,28 @@ public function testSpecialFooter() $this->assertProxySame($proxy, 0.4, self::DPI); } + + public function testFooterWithCustomFont() + { + $setaFpdf = new class extends SetaFpdf { + public function Footer() + { + $this->SetY(-15); + $this->Cell(0, 10, 'This is a footer'); + } + }; + + $setaFpdf->AddPage(); + $setaFpdf->AddFont('DejaVuSans','', __DIR__ . '/../../../../assets/fonts/DejaVu/DejaVuSans.ttf'); + $setaFpdf->SetFont('DejaVuSans', '', 12); + $setaFpdf->Cell(0, 10, 'Hello World'); + + $testFile = __DIR__ . '/FooterWithCustomFontActualResult.pdf'; + $setaFpdf->Output('F', $testFile); + $this->assertPdfsEqual([ + __DIR__ . '/FooterWithCustomFontExpectedResult.pdf', + $testFile + ], self::DPI, 1, false); + \unlink($testFile); + } } \ No newline at end of file diff --git a/tests/visual/SetaFpdf/Special/FooterWithCustomFontExpectedResult.pdf b/tests/visual/SetaFpdf/Special/FooterWithCustomFontExpectedResult.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a43e57cd9c9fa2f4a48ed1f8dbaeef8677010bef GIT binary patch literal 5757 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 literal 0 HcmV?d00001