Ga naar inhoud

Vectorafbeeldingen tekenen — vormen, kleuren en lijnstijlen

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.

Terminal window
composer require nextpdf/core:^3

Je 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.

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).

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'): static
  • roundedRect(float $x, float $y, float $w, float $h, float $r, string $style = 'S'): static
  • circle(float $x, float $y, float $r, string $style = 'S'): static
  • ellipse(float $x, float $y, float $rx, float $ry, string $style = 'S'): static
  • line(float $x1, float $y1, float $x2, float $y2): static
  • setFillColor(int $r, int $g = -1, int $b = -1): static / setDrawColor(...)
  • setLineWidth(float $width): static
<?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');

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";
  • 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 met setFillColor(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.

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.

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.

VerklaringSpecClausulereference_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.

Niet van toepassing. Vectortekenen is een Core-functie zonder Premium-grens.