Ga naar inhoud
getnextpdf.com

Pro editie

Chart — Diepe referentie

Deze pagina is de referentie op contractniveau voor de NextPDF Pro Chart-module. Het oppervlak bestaat uit vijf publieke classes in NextPDF\Pro\Chart: de renderers BarChart, LineChart en PieChart, de plaatsingsrechthoek ChartBox en het value-object ChartColor. Elke renderer is een drawing-primitive. Een statische factory creëert die, fluent with*()-aanroepen configureren die, en render(ChartBox $box): string retourneert PDF-content-stream-operatoren voor de aangeleverde rechthoek. De uitvoer is vector-only en deterministisch: identieke invoer en configuratie leveren identieke bytes op. Gedegenereerde invoer retourneert een lege string in plaats van te werpen, zodat een chart nooit de omringende pagina breekt. De taakgerichte weergave vind je op de capability-pagina.

Deze capability wordt geleverd in NextPDF Pro (nextpdf/pro) en activeert met een licentie-envelope op Pro-niveau. Een deployment zonder die entitlement laadt de classes van de capability niet. Vergelijk edities en vraag een licentie aan.

Chart-renderers zijn capability-gelicentieerd onder de chart.*-capabilityfamilie. Wanneer de capability niet gelicentieerd is, zijn de chart-renderers niet beschikbaar.

Terminal window
composer require nextpdf/pro:^3
SymboolParametersStandaardgedragRetourneertWerpt of faalt metNotities
BarChart::fromData()list<string> $labels, list<int|float> $valuesWaarden worden naar float gecastselfWerpt nietEnige constructiepad; de constructor is private
BarChart::withBarColor()ChartColor $colorBar-fill; standaard is palette-entry 0selfWerpt nietFluent; muteert de receiver
BarChart::withAxisColor()ChartColor $colorAxis-stroke; standaard #333333selfWerpt niet
BarChart::withBarGap()float $gapGap als fractie van de slot-breedte; standaard 0.2selfWerpt nietGeclampt naar 0.00.9; out-of-range-invoer wordt geclampt, niet afgewezen
BarChart::withFontSize()float $sizeLabel-fontgrootte in punten; standaard 7.0selfWerpt niet
BarChart::render()ChartBox $boxAssen, bars, categorielabels, vijf value-ticksstring-operatorenWerpt niet; lege data retourneert ''Een niet-positief maximum schaalt tegen 1.0
LineChart::create()list<string> $labelsChart zonder seriesselfWerpt nietDe constructor is private
LineChart::fromData()list<string> $labels, list<int|float> $valuesVoegt één naamloze series toeselfWerpt nietSingle-series-gemak
LineChart::addSeries()string $name, list<int|float> $values, ?ChartColor $color = nullEen null-kleur wordt automatisch toegewezen vanuit de palette op basis van de series-indexselfWerpt nietDe series-naam is gereserveerd voor legend-gebruik
LineChart::withAxisColor()ChartColor $colorAxis-stroke; standaard #333333selfWerpt niet
LineChart::withLineWidth()float $widthSeries-stroke-breedte; standaard 1.5selfWerpt niet
LineChart::withFontSize()float $sizeLabel-fontgrootte; standaard 7.0selfWerpt niet
LineChart::withDots()bool $show, float $radius = 2.5Data-point-markers; standaard aanselfWerpt nietMarkers worden getekend als Bezier-benaderde cirkels
LineChart::withGrid()bool $showHorizontale kwartiel-grid; standaard aanselfWerpt niet
LineChart::render()ChartBox $boxGrid, assen, één path per series, labelsstring-operatorenWerpt niet; geen series retourneert ''Een series korter dan twee punten tekent geen path
PieChart::fromData()list<string> $labels, list<int|float> $valuesProporties berekend uit de som van de waardenselfWerpt nietDe constructor is private
PieChart::withColors()list<ChartColor> $colorsEén kleur per slice, op volgordeselfWerpt nietOntbrekende entries vallen terug op de palette
PieChart::withStrokeColor()ChartColor $colorSlice-outline; standaard witselfWerpt niet
PieChart::withFontSize()float $sizeLabel-fontgrootte; standaard 7.0selfWerpt niet
PieChart::withPercentages()bool $showPercentage-labels; standaard aanselfWerpt nietLabels worden alleen gerenderd op slices die meer dan 15 graden bestrijken
PieChart::withLegend()bool $showLegend aan de rechterkant; standaard aanselfWerpt nietDe legend reserveert 80 punten box-breedte
PieChart::render()ChartBox $boxSectoren, optionele labels, optionele legendstring-operatorenWerpt niet; lege data of een totaal op of onder nul retourneert ''Bogen splitsen in Bezier-segmenten van maximaal 90 graden
ChartBox::__construct()float $x, float $y, float $width, float $heightPDF-oorsprong linksonder, in puntenWerpt nietfinal readonly; dimensies worden niet gevalideerd
ChartBox::fromUserSpace()float $x, float $y, float $width, float $height, float $pageHeightKlapt een rechthoek met oorsprong linksboven om naar PDF-coördinatenselfWerpt niet
ChartBox::right()geenx + widthfloatWerpt nietMethode, geen property
ChartBox::top()geeny + heightfloatWerpt nietMethode, geen property
ChartBox::inset()float $left, float $bottom, float $right, float $topSub-box verkleind met de gegeven insetsselfWerpt nietTe grote insets leveren negatieve dimensies op; niet gevalideerd
ChartColor::__construct()float $r, float $g, float $b, elk 0.01.0Werpt nietfinal readonly; componenten worden niet geclampt
ChartColor::rgb()int $r, int $g, int $b, elk 0255Schaalt componenten naar 0.01.0selfWerpt niet
ChartColor::hex()string $hexAccepteert #-geprefixte of kale zescijferige hexselfWerpt nietOntbrekende achterliggende cijfers decoderen als nul
ChartColor::palette()int $indexIngebouwde 12-kleuren-paletteselfTypeError bij een negatieve indexNiet-negatieve indexen wrappen modulo 12
ChartColor::strokeOperator()geenStroke-kleuroperator (RG), drie decimalenstringWerpt nietMethode, geen property
ChartColor::fillOperator()geenFill-kleuroperator (rg), drie decimalenstringWerpt nietMethode, geen property
public static function fromData(array $labels, array $values): self
public function withBarColor(ChartColor $color): self
public function withAxisColor(ChartColor $color): self
public function withBarGap(float $gap): self
public function withFontSize(float $size): self
public function render(ChartBox $box): string
public static function create(array $labels): self
public static function fromData(array $labels, array $values): self
public function addSeries(string $name, array $values, ?ChartColor $color = null): self
public function withAxisColor(ChartColor $color): self
public function withLineWidth(float $width): self
public function withFontSize(float $size): self
public function withDots(bool $show, float $radius = 2.5): self
public function withGrid(bool $show): self
public function render(ChartBox $box): string
public static function fromData(array $labels, array $values): self
public function withColors(array $colors): self
public function withStrokeColor(ChartColor $color): self
public function withFontSize(float $size): self
public function withPercentages(bool $show): self
public function withLegend(bool $show): self
public function render(ChartBox $box): string
public function __construct(
public float $x,
public float $y,
public float $width,
public float $height,
)
public static function fromUserSpace(
float $x,
float $y,
float $width,
float $height,
float $pageHeight,
): self
public function right(): float
public function top(): float
public function inset(float $left, float $bottom, float $right, float $top): self
public static function rgb(int $r, int $g, int $b): self
public static function hex(string $hex): self
public static function palette(int $index): self
public function strokeOperator(): string
public function fillOperator(): string

Alle drie de renderers volgen één lifecycle: een statische factory, fluent configuratie, één render()-aanroep. Configuratiemethoden muteren de receiver en retourneren die; renderers zijn geen immutable value-objecten. render() leest de configuratie zonder die te muteren, zodat één geconfigureerde renderer in meerdere boxes kan renderen. Elke render wikkelt de uitvoer in een save/restore-graphics-state-paar, zodat chart-state nooit naar de pagina lekt. Coördinaten worden met twee decimalen uitgezonden en kleurcomponenten met drie, wat de uitvoer byte-stabiel houdt. Tekst wordt gerenderd via de font-resourcenaam /ChartFont op de geconfigureerde grootte; de aanroeper registreert een font onder die naam in de resource-dictionary van de doelpagina. Label-strings escapen backslash en haakjes voordat ze in string-operanden terechtkomen. Renderers voeren geen reflow, geen clipping en geen container-onderhandeling uit: de aanroeper is eigenaar van de plaatsing.

Bar- en line-charts reserveren een vaste plot-inset binnen de box: 40 punten links, 20 onder, 10 rechts, 10 boven. Het resterende plot-gebied schaalt waarden lineair tegen het series-maximum. Een maximum van nul of lager schaalt in plaats daarvan tegen 1.0, zodat all-zero-data assen rendert met vlakke inhoud in plaats van te delen door nul. Beide tekenen X- en Y-assen op 0.5-punt-breedte en vijf value-ticks op kwartielposities. Bar-charts formatteren tick-waarden met K- en M-suffixen boven duizend en één miljoen; line-charts printen kale getallen.

Elke waarde bezet een gelijke slot over de plot-breedte. De bar vult de slot minus de geconfigureerde gap-fractie en wordt in de slot gecentreerd. Categorielabels worden 12 punten onder het plot-gebied getekend.

De grid tekent, indien ingeschakeld, vier horizontale kwartiellijnen in lichtgrijs (0.85 0.85 0.85 RG) onder de assen en series. Elke series tekent één polyline door zijn punten, over de volledige plot-breedte. Optionele markers worden getekend als Bezier-cirkels van vier segmenten op elk data-point. Series-kleuren vallen standaard terug op opeenvolgende palette-entries in invoegvolgorde.

Slices worden uitgelegd in data-volgorde, beginnend bij de positieve X-as en tegen de klok in bestrijkend. Elk sector-path sluit en schildert met gecombineerde fill en stroke (h B); bogen splitsen in Bezier-segmenten van maximaal 90 graden. Percentage-labels ronden af op hele procenten en worden alleen gerenderd op slices die meer dan 15 graden bestrijken. De legend reserveert, indien ingeschakeld, 80 punten box-breedte aan de rechterkant en rendert een swatch van 8 punten per entry op een lijnhoogte van 12 punten. De radius is de helft van de kleinste van de resterende breedte en de box-hoogte, minus een marge van 10 punten.

ChartBox is een immutable rechthoek in PDF-user-units (punten) met een oorsprong linksonder. ChartBox::fromUserSpace() converteert een rechthoek met oorsprong linksboven door om te klappen tegen de aangeleverde paginahoogte. inset() retourneert een nieuwe, kleinere box; right() en top() zijn accessor-methoden. ChartColor is zelfstandig en is niet afhankelijk van de Core-kleur-classes. De palette met 12 entries wijst series- en slice-kleuren toe wanneer de aanroeper er geen aanlevert.

Een chart-type of -feature verdient alleen Verified wanneer een pro/tests/**-fixture die oefent. Geen externe standaard regelt charts, dus het bewijs is gedragsdekking op unit-niveau.

Chart-type / featureStatusBewijs (testpad)VertrouwenNotities
Bar chart — render, axes, bar-rectangles, gap-clamping, empty/all-zero-data, K/M-value-formattingVerifiedpro/tests/Unit/Chart/BarChartTest.php; BarChartArithmeticCoverageTest.php; BarChartBoundaryCoverageTest.phphighGraphics-state-wrap, axis-lijnen, bar-hoogteproporties, tick-count en formatting-grenzen geasserteerd.
Line chart — single- en multi-series, line path, axes, dots, grid, single-pointVerifiedpro/tests/Unit/Chart/LineChartTest.php; LineChartCoverageTest.php; LineChartArithmeticCoverageTest.php; LineChartTypeCastCoverageTest.phphighMulti-series, single-point no-line, empty-series, grid- en dot-paden gedekt.
Pie chart — sectors, Bezier-segmentatie, percentages, legend, zero/negative-totalVerifiedpro/tests/Unit/Chart/PieChartTest.php; PieChartArithmeticCoverageTest.php; PieChartBoundaryCoverageTest.phphighSector-paden, segmentaantallen per sweep, de 15-graden-label-drempel, legend-geometrie en empty-string-gedrag gedekt.
ChartBox — coördinaatconversie (user-space naar PDF), page top/bottom, zero dims, insetVerifiedpro/tests/Unit/Chart/ChartBoxTest.phphighTop-left-origin- naar bottom-left-origin-conversie bij paginatop, -bodem en zero-dimension-randen.
ChartColor — RGB-scaling, hex-parsing, palette, stroke/fill-operatorsVerifiedpro/tests/Unit/Chart/ChartColorTest.phphigh0–255- naar 0–1-scaling, #-geprefixte en kale hex, gemengde casing, palette-wrap-around na 12 entries.
Cross-renderer-regressiehardeningVerifiedpro/tests/Unit/Chart/ChartCoverageTest.phphighGedeelde regressiesuite over de drie renderers plus value-formatting-rekenwerk.
Chart-types buiten bar/line/pie (area, scatter, stacked, donut, etc.)Not supportedhighEr wordt geen renderer geleverd. Het module-oppervlak is precies bar, line, pie. Eerlijk gesteld: dit is niet “elk chart-type”.

Eerlijke telling: Verified 6 rijen, Claimed 0, Not supported 1 (elk chart-type anders dan bar, line, pie).

  • Geen renderer werpt op data. Gedegenereerde invoer degradeert naar een lege string: lege bar- of line-data, een lege series-lijst en een pie-totaal op of onder nul retourneren allemaal ''.
  • Een line-series met minder dan twee punten tekent geen path en geen markers; assen en labels worden nog steeds gerenderd.
  • Negatieve bar-waarden worden niet afgewezen; de bar-rechthoek strekt zich uit onder de X-as.
  • Label- en waarde-aantallen worden niet onderling gevalideerd. De aanroeper levert lijsten van overeenkomende lengte aan.
  • Een ChartBox met nul of negatieve dimensies wordt geaccepteerd en produceert gedegenereerde uitvoer; aanroepers moeten de box dimensioneren.
  • Renderers clippen niet. Een te grote chart, zijn categorielabels onder de plot of een lange legend kunnen over de bedoelde paginaregio heen lopen.
  • Een pagina zonder font onder de chart-font-resourcenaam laat text-operatoren achter die naar een ongedefinieerde resource verwijzen; het viewer-gedrag is dan ongedefinieerd.
  • ChartColor::hex() voert geen validatie uit; invoer korter dan zes cijfers decodeert ontbrekende componenten als nul. ChartColor::palette() faalt met TypeError bij een negatieve index, omdat PHP’s negatieve modulo geen palette-key oplost.
  • De module voert geen cryptografie uit; de FIPS-modus heeft geen chart-specifiek gedrag.

De Chart-module zendt PDF-content-stream-operatoren uit. Geen externe chart-, symbologie- of cryptografische standaard regelt de uitvoer, dus het enige conformiteitsoppervlak is de uitgezonden operator-stream.

ClaimStandaardClausule
Uitgezonden graphics volgen het content-stream-operatormodel; de uitvoer nestelt binnen een opgeslagen en herstelde graphics-state.ISO 32000-2§8.1
Bars, lines, sectoren en markers zijn path-objecten: de constructie begint met m of re en eindigt met een path-painting-operator.ISO 32000-2§8.5.2
Labels worden gerenderd als text-objecten: de positie wordt vastgesteld na BT, en glyphs worden geschilderd met de Tj-text-showing-operator.ISO 32000-2§9.2.2, §9.4.3

Alle clausules zijn geparafraseerd; deze pagina reproduceert geen normatieve tekst. Dit zijn capability-verklaringen, geen certificeringen; NextPDF houdt geen certificering en verleent er geen. Correcte rendering van de stream hangt ook af van een welgevormd omvattend document, wat de verantwoordelijkheid van de document-schrijver is.

  • Alle vijf classes dragen @since 1.9.0 en zijn actueel in nextpdf/pro 3.1.0.
  • De module is zelfstandig: renderers zijn alleen afhankelijk van ChartBox en ChartColor, zonder Core-koppeling.
  • Deterministische uitvoer houdt charted documenten reproduceerbaar, diff-stabiel en veilig om te signen of te archiveren.
  • Registreer eenmaal per pagina die charts host een font onder de chart-font-resourcenaam.
  • Hergebruik een geconfigureerde renderer vrij over boxes; render() voert geen state-mutatie uit.
  • Testbewijs leeft onder pro/tests/Unit/Chart/; de support-matrix verankert elke Verified-rij aan zijn suite.

Deze pagina documenteert alleen extern waarneembaar gedrag en het ondersteunde publieke API-oppervlak. Interne namespace-paden, helper-classes, mechanisme-tabellen, runbook-bestandsnamen en ticket-prefixen vallen buiten scope.