SetaPDF Demos PHP libraries to handle, modify or create PDF files

Styles and Text Align

This demo creates some rich-text stamps with various alignments and positions.

PHP
<?php

use setasign\SetaPDF2\Demos\FontLoader;
use setasign\SetaPDF2\Core\Document;
use setasign\SetaPDF2\Core\PageFormats;
use setasign\SetaPDF2\Core\Text\Text;
use setasign\SetaPDF2\Core\Writer\HttpWriter;
use setasign\SetaPDF2\Stamper\Stamp\RichTextStamp;
use setasign\SetaPDF2\Stamper\Stamper;

// load and register the autoload function
require_once __DIR__ . '/../../../../../../bootstrap.php';

$text = <<<HTML
An <span style="color:#ff0000">example</span> text with <span style="font-size:200%;line-height: 0.9">some</span> more content<br/>
and <u>line-breaks</u> to be able to <i style="font-size: 14pt">align</i><br/>
the text at <b>all</b>.
HTML;

// we create a blank document to show the behavior
$writer = new HttpWriter('stamped.pdf', true);
$document = new Document($writer);

// let's create 3 pages for demonstration purpose
$pages = $document->getCatalog()->getPages();
$pages->create(PageFormats::A4);
$pages->create(PageFormats::A4);
$pages->create(PageFormats::A4);

// create a stamper instance
$stamper = new Stamper($document);

require_once $classesDirectory . '/FontLoader.php';
$fontLoader = new FontLoader($assetsDirectory);

// create a stamp instance left aligned
$stampLeft = new RichTextStamp($document, $fontLoader);
$stampLeft->setDefaultFontFamily('DejaVuSans');
$stampLeft->setText($text);
$stampLeft->setAlign(Text::ALIGN_LEFT);
$stamper->addStamp($stampLeft);

// create a stamp instance centered
$stampCenter = new RichTextStamp($document, $fontLoader);
$stampCenter->setDefaultFontFamily('DejaVuSans');
$stampCenter->setText($text);
$stampCenter->setAlign(Text::ALIGN_CENTER);
$stamper->addStamp($stampCenter, [
    'position' => Stamper::POSITION_CENTER_MIDDLE,
    'translateY' => 140
]);

// create a stamp instance justified
$stampCenter = new RichTextStamp($document, $fontLoader);
$stampCenter->setDefaultFontFamily('DejaVuSans');
$stampCenter->setText($text);
$stampCenter->setAlign(Text::ALIGN_JUSTIFY);
$stamper->addStamp($stampCenter, [
    'position' => Stamper::POSITION_CENTER_MIDDLE,
    'translateY' => -140
]);

// create a stamp instance right aligned
$stampRight = new RichTextStamp($document, $fontLoader);
$stampRight->setDefaultFontFamily('DejaVuSans');
$stampRight->setText($text);
$stampRight->setAlign(Text::ALIGN_RIGHT);
$stamper->addStamp($stampRight, Stamper::POSITION_RIGHT_BOTTOM);

// execute the stamp process
$stamper->stamp();

// save and finish the document instance
$document->save()->finish();
PHP
<?php

namespace setasign\SetaPDF2\Demos;

use setasign\SetaPDF2\Core\Document;
use setasign\SetaPDF2\Core\Font\Type0\Subset;

/**
 * This is a simple, straight forward font-loader implementation.
 * It should give you an idea of how to create your own.
 */
class FontLoader
{
    /**
     * @var Subset[]
     */
    protected $loadedFonts = [];

    /**
     * @var string
     */
    protected $assetsDirectory;

    /**
     * @param $assetsDirectory
     * @param $loadedFonts
     */
    public function __construct($assetsDirectory, &$loadedFonts = [])
    {
        $this->assetsDirectory = $assetsDirectory;
        $this->loadedFonts = &$loadedFonts;
    }

    /**
     * This is the method that is called when a font is requested.
     *
     * @param Document $document
     * @param string $fontFamily
     * @param string $fontStyle
     * @return Subset
     */
    public function __invoke(Document $document, string $fontFamily, string $fontStyle)
    {
        $cacheKey = $document->getInstanceIdent() . '_' . $fontFamily . '_' . $fontStyle;
        if (!array_key_exists($cacheKey, $this->loadedFonts)) {
            $dejavuFontPath = $this->assetsDirectory . '/fonts/DejaVu/ttf/DejaVuSans';
            if ($fontFamily === 'DejaVuSans' && $fontStyle === 'B') {
                $font = new Subset($document, $dejavuFontPath . '-Bold.ttf');
            } elseif ($fontFamily === 'DejaVuSans' && $fontStyle === 'I') {
                $font = new Subset($document, $dejavuFontPath . '-Oblique.ttf');
            } elseif ($fontFamily === 'DejaVuSans' && $fontStyle === 'BI') {
                $font = new Subset($document, $dejavuFontPath . '-BoldOblique.ttf');
            } else {
                $font = new Subset($document, $dejavuFontPath . '.ttf');
            }

            $this->loadedFonts[$cacheKey] = $font;
        }
        return $this->loadedFonts[$cacheKey];
    }
}