Ga naar inhoud
getnextpdf.com

Tekst, lettertypes en paginabasis

In de eerste tutorial renderde je een pagina met één enkele regel tekst. Deze keer neem je de controle over de pagina zelf en over de tekst erop. Je kiest een paginaformaat, schrijft koppen en alinea’s, en geeft ze stijl met de ingebouwde lettertypes van de engine.

Je schrijft twee kleine scripts. Elk daarvan produceert een Portable Document Format-bestand (PDF) van één pagina:

  • 01-text-basics.php rendert een A4-pagina in portret met een gekleurde kop, teruglopende alinea’s en drie uitlijningsvoorbeelden.
  • 02-fonts.php rendert een voorbeeldpagina die twee ingebouwde lettertypefamilies in verschillende groottes vergelijkt.

Alles draait met alleen het pakket nextpdf/core. Je hebt geen lettertypebestanden nodig, geen extra extensies en geen netwerk. Heb je nog geen project opgezet, volg dan eerst de eerste tutorial en kom daarna terug.

Elke pagina heeft een formaat en een oriëntatie. A4 is het gangbare internationale papierformaat en Letter is de Amerikaanse tegenhanger. De oriëntatie is ofwel portret (staand) ofwel landschap (liggend). Je geeft beide keuzes door aan addPage() wanneer je een pagina begint.

Drie methoden verzorgen vervolgens het schrijven. setFont() kiest het lettertype en de grootte voor de tekst die volgt. cell() schrijft één regel binnen een onzichtbaar vak. multiCell() laat langere tekst teruglopen over zoveel regels als nodig is. In beide methoden betekent een breedte van 0 “gebruik alles tot aan de rechtermarge”.

Twee andere aanroepen bepalen het uiterlijk. setTextColor() verwacht rode, groene en blauwe waarden van 0 tot 255 en blijft gelden totdat je die opnieuw wijzigt. De Alignment-enum, een vaste lijst met benoemde keuzes, biedt Left, Center, Right en Justify.

Maak 01-text-basics.php aan in je projectmap:

<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use NextPDF\Contracts\Alignment;
use NextPDF\Contracts\Orientation;
use NextPDF\Core\Document;
use NextPDF\ValueObjects\PageSize;
@mkdir(__DIR__ . '/out');
$document = Document::createStandalone();
$document->setTitle('Text basics');
$document->addPage(PageSize::A4(), Orientation::Portrait);
// A colored heading. The values are red, green, and blue, each 0 to 255.
$document->setFont('helvetica', 'B', 20);
$document->setTextColor(30, 64, 175);
$document->cell(0, 14, 'Project kickoff notes', newLine: true);
$document->ln(4);
// Back to black for the body text.
$document->setTextColor(0, 0, 0);
$document->setFont('helvetica', '', 11);
$document->multiCell(
0,
7,
'Welcome to the second tutorial. This paragraph is written with '
. 'multiCell(), so the engine wraps the words onto as many lines '
. 'as the page width requires.',
);
$document->ln(4);
$document->multiCell(
0,
7,
'Justified text stretches the spaces so both edges line up. It is a '
. 'good fit for report bodies and other long passages.',
align: Alignment::Justify,
);
$document->ln(6);
// One line each: left, centered, and right.
$document->setFont('helvetica', 'I', 11);
$document->cell(0, 8, 'Left-aligned line', newLine: true, align: Alignment::Left);
$document->cell(0, 8, 'Centered line', newLine: true, align: Alignment::Center);
$document->cell(0, 8, 'Right-aligned line', newLine: true, align: Alignment::Right);
$document->save(__DIR__ . '/out/text-basics.pdf');
echo "Wrote out/text-basics.pdf\n";

Voer het uit met php 01-text-basics.php. Het script drukt Wrote out/text-basics.pdf af en het bestand verschijnt in de nieuwe map out/.

addPage(PageSize::A4(), Orientation::Portrait) maakte de pagina aan voordat er tekst werd geschreven. Geef in plaats daarvan Orientation::Landscape door en dezelfde pagina draait liggend. Andere benoemde formaten, zoals PageSize::A5() of PageSize::Letter(), werken op dezelfde manier.

setFont('helvetica', 'B', 20) selecteerde vette Helvetica op 20 punten. Een punt (pt) is de traditionele drukeenheid; 72 punten zijn één inch. De kop is blauw omdat setTextColor(30, 64, 175) actief was toen de cell()-aanroep hem schreef. De volgende setTextColor(0, 0, 0) schakelde terug naar zwart voor alles daarna.

De twee multiCell()-aanroepen lieten hun alinea’s automatisch teruglopen. De uitgevulde variant rekt de woordspatiëring op zodat beide randen uitlijnen, behalve op de laatste regel van de alinea. Tussen blokken door verplaatste ln() de schrijfpositie omlaag om wat lucht toe te voegen. Ten slotte bouwde save() het bestand en schreef het weg naar out/.

Voor elke parameter die deze methoden accepteren, zie Tekst samenstellen met lettertypes en uitlijning.

De engine levert drie ingebouwde tekstfamilies: Helvetica, Times en Courier. Helvetica is een schreefloos lettertype, wat betekent dat de letters geen kleine eindstreepjes (schreven) hebben. Times is een lettertype met schreef dat goed leest in lange, drukwerkachtige passages. Courier heeft een vaste breedte en is daarom geschikt voor codelijsten en bonnetjes. Omdat deze families ingebouwd zijn, hebben je scripts helemaal geen lettertypebestanden nodig.

Het stijlargument van setFont() combineert vlaggen van één letter: 'B' voor vet, 'I' voor cursief en 'U' voor onderstreept. Een lege string betekent regulier, en vlaggen laten zich combineren, dus 'BI' geeft vet cursief.

De ingebouwde families dekken tekst in het Latijnse schrift. Voor andere schriftsystemen of je eigen merklettertype registreer je een lettertypebestand, zoals het recept Lettertypes insluiten en subsetten (subsetten behoudt alleen de tekens die je daadwerkelijk hebt gebruikt, zodat bestanden klein blijven) laat zien. De lettertype-ondersteuningsmatrix vermeldt elk lettertypeformaat dat de engine accepteert.

Maak 02-fonts.php aan naast het eerste script:

<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
@mkdir(__DIR__ . '/out');
$document = Document::createStandalone();
$document->setTitle('Font sampler');
$document->addPage();
$document->setFont('helvetica', 'B', 20);
$document->cell(0, 14, 'Built-in font sampler', newLine: true);
$document->ln(4);
// Helvetica: a sans-serif face, a solid default for labels and headings.
$document->setFont('helvetica', 'B', 14);
$document->cell(0, 10, 'Helvetica', newLine: true);
foreach ([10, 12, 16] as $size) {
$document->setFont('helvetica', '', (float) $size);
$document->cell(0, $size * 0.8, "Helvetica sample at {$size}pt.", newLine: true);
}
$document->setFont('helvetica', 'BI', 12);
$document->cell(0, 9, 'Helvetica bold italic for emphasis.', newLine: true);
$document->ln(6);
// Times: a serif face that suits long, print-like passages.
$document->setFont('times', 'B', 14);
$document->cell(0, 10, 'Times', newLine: true);
foreach ([10, 12, 16] as $size) {
$document->setFont('times', '', (float) $size);
$document->cell(0, $size * 0.8, "Times sample at {$size}pt.", newLine: true);
}
$document->setFont('times', 'I', 12);
$document->cell(0, 9, 'Times italic for quotations.', newLine: true);
$document->save(__DIR__ . '/out/font-sampler.pdf');
echo "Wrote out/font-sampler.pdf\n";

Voer het uit met php 02-fonts.php en open out/font-sampler.pdf. Je ziet dezelfde voorbeeldzin van karakter veranderen tussen de twee families en groter worden over drie groottes.

addPage() zonder argumenten gebruikte de standaardpagina-instelling in portretoriëntatie, zodat niet elk script het formaat expliciet hoeft te vermelden. Elke setFont()-aanroep wisselde de actieve familie, stijl of grootte midden op de pagina, en een lettertype blijft actief tot de volgende setFont()-aanroep.

De lussen casten de grootte met (float) omdat setFont() een decimaal getal verwacht. De regelhoogtes schalen mee met de lettertypegrootte ($size * 0.8), zodat grotere tekst hogere regels krijgt en niets overlapt. Vervang 'times' eens door 'courier' en voer het script opnieuw uit om de derde familie te zien.

  • Een fout als “class not found” of een autoload-fout betekent meestal dat het script vendor/autoload.php niet vond. Voer het uit binnen de projectmap die vendor/ bevat.
  • Een verkeerd getypte familienaam werpt een exception op die het lettertype noemt dat niet gevonden kon worden. Controleer de spelling: helvetica, times, courier.
  • De probleemoplossingshub verzamelt veelvoorkomende oplossingen, en Lettertypes en tagging behandelt lettertypeproblemen in detail.
  • Elke engine-exception is gedocumenteerd in de foutreferentie, met de context die deze meedraagt en de herstelactie.

Je kunt nu pagina’s vormgeven, tekst opmaken en doelbewust lettertypes kiezen. In de volgende tutorial plaats je afbeeldingen op de pagina en organiseer je de inhoud met tabellen en lijsten.