Vectorafbeeldingen tekenen — vormen, kleuren en lijnstijlen
In één oogopslag
Sectie met titel “In één oogopslag”Gebruik dit recipe om primitieve vormen met vulling en omlijning te tekenen: rechthoeken, afgeronde rechthoeken, cirkels, ellipsen en lijnen. Voor elke vorm stel je de vulkleur, lijnkleur en lijndikte in. Het recipe volgt examples/06-colors-and-drawing.php.
Elke primitieve vorm komt overeen met een ISO 32000-2-padobject. Een padobject is een vorm die is opgebouwd uit lijn- en curvesegmenten. Het eindigt met een tekenoperator die de viewer opdracht geeft om te omlijnen, te vullen of allebei te doen.
Installeren
Sectie met titel “Installeren”composer require nextpdf/core:^3Je hebt geen optionele extensie nodig. De API (application programming interface) voor tekenen en kleuren is stabiel sinds 1.0.0 en wordt ondersteund op de backport-matrix 8.1–8.4.
Conceptueel overzicht
Sectie met titel “Conceptueel overzicht”Stel eerst de status in en teken daarna. setFillColor(), setDrawColor() en setLineWidth() werken de grafische status bij. De volgende rect(), circle(), ellipse(), roundedRect() of line() gebruikt die status. Vormmethoden krijgen een stijlargument: 'F' vult, 'S' omlijnt (de standaard) en 'DF'/'FD' doet beide. Intern bestaat een gevulde rechthoek uit de padconstructie-operator re, gevolgd door de vultekenoperator. ISO 32000-2 §8.5.3 specificeert S voor omlijnen en f voor vullen als de belangrijkste padtekenoperatoren.
Kleuren zijn apparaatkleuren. setFillColor(r, g, b) selecteert DeviceRGB. ISO 32000-2 §8.6.4.3 definieert rg als de DeviceRGB-operator voor niet-omlijnende kleur en g als het DeviceGray-equivalent. Een aanroep van setFillColor($v) met één argument stelt een grijswaarde in. De lijndikte is standaard 1.0 en het streeppatroon is standaard een doorlopende lijn (§8.4.3.6).
API-oppervlak
Sectie met titel “API-oppervlak”Het API-oppervlak wordt gegenereerd uit PHPDoc. Dit recipe gebruikt de volgende methoden:
rect(float $x, float $y, float $w, float $h, string $style = 'S'): staticroundedRect(float $x, float $y, float $w, float $h, float $r, string $style = 'S'): staticcircle(float $x, float $y, float $r, string $style = 'S'): staticellipse(float $x, float $y, float $rx, float $ry, string $style = 'S'): staticline(float $x1, float $y1, float $x2, float $y2): staticsetFillColor(int $r, int $g = -1, int $b = -1): static/setDrawColor(...)setLineWidth(float $width): static
Codevoorbeeld — Snel aan de slag
Sectie met titel “Codevoorbeeld — Snel aan de slag”<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();$doc->addPage();
$doc->setFillColor(30, 58, 138);$doc->rect(20, 30, 60, 40, 'F'); // filled rectangle
$doc->setDrawColor(217, 119, 6);$doc->setLineWidth(1.0);$doc->circle(140, 50, 20, 'S'); // stroked circle
$doc->setLineWidth(0.3);$doc->line(20, 90, 190, 90); // thin rule
$doc->save(getenv('NEXTPDF_COOKBOOK_OUTPUT') ?: __DIR__ . '/vector.pdf');Codevoorbeeld — Productie
Sectie met titel “Codevoorbeeld — Productie”Dit volledige voorbeeld is geschikt voor de harness, respecteert NEXTPDF_COOKBOOK_OUTPUT en voegt zelf geen entropie toe.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();$doc->setTitle('Colors and Drawing');$doc->addPage();
$doc->setFont('helvetica', 'B', 18);$doc->cell(0, 12, 'Colors and Drawing', newLine: true);$doc->ln(5);
// --- Filled rectangles: set fill colour, then draw with style 'F' ---$palette = [ [30, 58, 138], [217, 119, 6], [30, 27, 75], [239, 66, 35], [21, 128, 61],];$x = 15.0;$rowY = $doc->getY();foreach ($palette as [$r, $g, $b]) { $doc->setFillColor($r, $g, $b); $doc->rect($x, $rowY, 30, 20, 'F'); $x += 35.0;}$doc->ln(28);
// --- Outlined shapes: set draw colour + line width, draw with 'S' ---$doc->setDrawColor(30, 58, 138);$doc->setLineWidth(0.5);$y = $doc->getY();$doc->rect(15, $y, 30, 25, 'S');$doc->roundedRect(55, $y, 30, 25, 5, 'S');$doc->circle(110, $y + 12.5, 12.5, 'S');$doc->ellipse(150, $y + 12.5, 18, 10, 'S');$doc->ln(33);
// --- Lines at three widths ---$y = $doc->getY();$doc->setDrawColor(0);$doc->setLineWidth(0.2);$doc->line(15, $y, 195, $y);$doc->setLineWidth(0.8);$doc->line(15, $y + 5, 195, $y + 5);$doc->setLineWidth(1.5);$doc->line(15, $y + 12, 195, $y + 12);
$out = getenv('NEXTPDF_COOKBOOK_OUTPUT') ?: __DIR__ . '/vector.pdf';$doc->save($out);
echo "Created vector.pdf\n";Randgevallen en valkuilen
Sectie met titel “Randgevallen en valkuilen”- De stijl is standaard omlijnen. Als je het stijlargument weglaat, wordt de vorm omlijnd (
'S'). Een vorm die onzichtbaar lijkt, is meestal getekend zonder ingestelde lijnkleur of gevuld met de achtergrondkleur van de pagina. Geef'F'mee om de vorm te vullen. - De kleurstatus blijft behouden. De met
setFillColor()ingestelde kleur blijft van kracht totdat je die wijzigt. Stel de kleur opnieuw in, bijvoorbeeld metsetFillColor(255), vóór het volgende niet-gerelateerde blok, anders werkt de kleur door. - Grijswaarde versus de RGB-overload.
setFillColor(128)is een grijswaarde.setFillColor(128, 0, 0)is RGB. De variant met één argument betekent dus niet „rood 128”. - De Y-as loopt in de API van boven naar beneden. De tekenhelpers gebruiken de oorsprong linksboven van het document. De engine zet dat voor je om naar de PDF-gebruikersruimte, met de oorsprong linksonder.
Prestaties
Sectie met titel “Prestaties”Elke primitieve vorm voegt enkele contentstream-operatoren toe. Duizenden vormen per pagina blijven ruim binnen het budget van 2000 ms / 64 MB. De kosten nemen lineair toe met het aantal primitieven. Er vindt geen rasterisatie plaats, dus de uitvoer blijft vectorgebaseerd.
Beveiligingsnotities
Sectie met titel “Beveiligingsnotities”Dit recipe tekent alleen de geometrie die je code opgeeft. Het verwerkt geen invoer en gebruikt geen netwerktoegang. Controleer het bereik van alle coördinaten die uit niet-vertrouwde gegevens afkomstig zijn. Zo voorkom je dat een kwaadaardige waarde markeringen ver buiten de pagina plaatst.
Conformiteit
Sectie met titel “Conformiteit”| Verklaring | Spec | Clausule | reference_id |
|---|---|---|---|
| Een padobject bestaat uit lijnen, rechthoeken en Bézierkrommen die eindigen met een tekenoperator. | ISO 32000-2 | §8.5 | |
S omlijnt een pad en f vult het. | ISO 32000-2 | §8.5.3 | |
rg stelt de niet-omlijnende kleur van DeviceRGB in; g stelt DeviceGray in. | ISO 32000-2 | §8.6.4.3 | |
De beginwaarde van het streeppatroon is [] 0, een doorlopende lijn. | ISO 32000-2 | §8.4.3.6 |
Reproduceerbaarheidsprofiel — structureel. Vectortekenen heeft geen eigen entropie. Toch bevat elk opgeslagen document een trailer-/ID en datumatomen. ISO 32000-2 §8.3.4 stelt ook dat de exacte volgorde van operatoren voor de grafische status geen semantische betekenis heeft, zodat een normaliseringsprogramma equivalente status opnieuw mag ordenen. De ondersteunde claim is structurele gelijkheid na qpdf-normalisatie. Dit recipe beschrijft hoe NextPDF de structuur produceert. Het doet geen algemene claim op ISO 32000-2-conformiteit.
Commerciële context
Sectie met titel “Commerciële context”Niet van toepassing. Vectortekenen is een Core-functie zonder Premium-grens.