Aller au contenu
getnextpdf.com

Pro édition

Chart — Référence approfondie

Cette page est la référence au niveau du contrat pour le module Chart de NextPDF Pro. La surface se compose de cinq classes publiques dans NextPDF\Pro\Chart : les moteurs de rendu BarChart, LineChart et PieChart, le rectangle de placement ChartBox et l’objet-valeur ChartColor. Chaque moteur de rendu est une primitive de dessin. Une fabrique statique le crée, des appels fluides with*() le configurent, et render(ChartBox $box): string renvoie les opérateurs de flux de contenu PDF pour le rectangle fourni. La sortie est purement vectorielle et déterministe : une entrée et une configuration identiques produisent des octets identiques. Les entrées dégénérées renvoient une chaîne vide au lieu de lever une exception, si bien qu’un graphique ne casse jamais la page environnante. La vue orientée tâches se trouve sur la page de capacité.

Cette capacité est livrée dans NextPDF Pro (nextpdf/pro) et s’active avec une enveloppe de licence de niveau Pro. Un déploiement dépourvu de ce droit ne charge pas les classes de la capacité. Comparer les éditions et obtenir une licence.

Les moteurs de rendu de graphiques sont soumis à une licence de capacité sous la famille de capacités chart.*. Lorsque la capacité n’est pas licenciée, les moteurs de rendu de graphiques ne sont pas disponibles.

Fenêtre de terminal
composer require nextpdf/pro:^3
SymboleParamètresComportement par défautRenvoieLève ou échoue avecNotes
BarChart::fromData()list<string> $labels, list<int|float> $valuesLes valeurs sont converties en floatselfNe lève pasSeule voie de construction ; le constructeur est privé
BarChart::withBarColor()ChartColor $colorRemplissage de barre ; par défaut, l’entrée 0 de la paletteselfNe lève pasFluide ; mute le receveur
BarChart::withAxisColor()ChartColor $colorTrait d’axe ; par défaut #333333selfNe lève pas
BarChart::withBarGap()float $gapEspacement en fraction de la largeur d’emplacement ; par défaut 0.2selfNe lève pasBorné à 0.00.9 ; une entrée hors plage est bornée, non rejetée
BarChart::withFontSize()float $sizeTaille de police des étiquettes en points ; par défaut 7.0selfNe lève pas
BarChart::render()ChartBox $boxAxes, barres, étiquettes de catégorie, cinq graduations de valeuropérateurs stringNe lève pas ; des données vides renvoient ''Un maximum non positif est mis à l’échelle par rapport à 1.0
LineChart::create()list<string> $labelsGraphique sans sérieselfNe lève pasLe constructeur est privé
LineChart::fromData()list<string> $labels, list<int|float> $valuesAjoute une série sans nomselfNe lève pasCommodité pour série unique
LineChart::addSeries()string $name, list<int|float> $values, ?ChartColor $color = nullUne couleur null est attribuée automatiquement depuis la palette selon l’index de sérieselfNe lève pasLe nom de série est réservé à l’usage de la légende
LineChart::withAxisColor()ChartColor $colorTrait d’axe ; par défaut #333333selfNe lève pas
LineChart::withLineWidth()float $widthLargeur de trait de série ; par défaut 1.5selfNe lève pas
LineChart::withFontSize()float $sizeTaille de police des étiquettes ; par défaut 7.0selfNe lève pas
LineChart::withDots()bool $show, float $radius = 2.5Marqueurs de points de données ; activés par défautselfNe lève pasLes marqueurs sont dessinés comme des cercles approximés par Bézier
LineChart::withGrid()bool $showGrille horizontale par quartiles ; activée par défautselfNe lève pas
LineChart::render()ChartBox $boxGrille, axes, un tracé par série, étiquettesopérateurs stringNe lève pas ; en l’absence de série, renvoie ''Une série de moins de deux points ne dessine aucun tracé
PieChart::fromData()list<string> $labels, list<int|float> $valuesProportions calculées à partir de la somme des valeursselfNe lève pasLe constructeur est privé
PieChart::withColors()list<ChartColor> $colorsUne couleur par secteur, dans l’ordreselfNe lève pasLes entrées manquantes se rabattent sur la palette
PieChart::withStrokeColor()ChartColor $colorContour de secteur ; blanc par défautselfNe lève pas
PieChart::withFontSize()float $sizeTaille de police des étiquettes ; par défaut 7.0selfNe lève pas
PieChart::withPercentages()bool $showÉtiquettes de pourcentage ; activées par défautselfNe lève pasLes étiquettes ne sont rendues que sur les secteurs balayant plus de 15 degrés
PieChart::withLegend()bool $showLégende à droite ; activée par défautselfNe lève pasLa légende réserve 80 points de la largeur de la boîte
PieChart::render()ChartBox $boxSecteurs, étiquettes optionnelles, légende optionnelleopérateurs stringNe lève pas ; des données vides ou un total inférieur ou égal à zéro renvoient ''Les arcs sont divisés en segments de Bézier d’au plus 90 degrés
ChartBox::__construct()float $x, float $y, float $width, float $heightOrigine PDF en bas à gauche, en pointsNe lève pasfinal readonly ; les dimensions ne sont pas validées
ChartBox::fromUserSpace()float $x, float $y, float $width, float $height, float $pageHeightBascule un rectangle d’origine en haut à gauche vers les coordonnées PDFselfNe lève pas
ChartBox::right()aucunx + widthfloatNe lève pasMéthode, pas une propriété
ChartBox::top()aucuny + heightfloatNe lève pasMéthode, pas une propriété
ChartBox::inset()float $left, float $bottom, float $right, float $topSous-boîte réduite par les retraits donnésselfNe lève pasDes retraits surdimensionnés produisent des dimensions négatives ; non validé
ChartColor::__construct()float $r, float $g, float $b, chacun 0.01.0Ne lève pasfinal readonly ; les composantes ne sont pas bornées
ChartColor::rgb()int $r, int $g, int $b, chacun 0255Met les composantes à l’échelle 0.01.0selfNe lève pas
ChartColor::hex()string $hexAccepte l’hexadécimal à six chiffres préfixé par # ou nuselfNe lève pasLes chiffres de fin absents se décodent comme zéro
ChartColor::palette()int $indexPalette intégrée de 12 couleursselfTypeError sur un index négatifLes index non négatifs bouclent modulo 12
ChartColor::strokeOperator()aucunOpérateur de couleur de trait (RG), trois décimalesstringNe lève pasMéthode, pas une propriété
ChartColor::fillOperator()aucunOpérateur de couleur de remplissage (rg), trois décimalesstringNe lève pasMéthode, pas une propriété
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

Les trois moteurs de rendu suivent un même cycle de vie : une fabrique statique, une configuration fluide, un seul appel à render(). Les méthodes de configuration mutent le receveur et le renvoient ; les moteurs de rendu ne sont pas des objets-valeurs immuables. render() lit la configuration sans la muter, si bien qu’un moteur de rendu configuré peut être rendu dans plusieurs boîtes. Chaque rendu enveloppe sa sortie dans une paire de sauvegarde/restauration de l’état graphique, si bien que l’état du graphique ne fuit jamais dans la page. Les coordonnées sont émises à deux décimales et les composantes de couleur à trois, ce qui maintient une sortie stable au niveau des octets. Le texte est rendu via le nom de ressource de police /ChartFont à la taille configurée ; l’appelant enregistre une police sous ce nom dans le dictionnaire de ressources de la page cible. Les chaînes d’étiquettes échappent la barre oblique inverse et les parenthèses avant d’entrer dans les opérandes de chaîne. Les moteurs de rendu n’effectuent aucun reflux, aucun détourage et aucune négociation de conteneur : l’appelant maîtrise le placement.

Les graphiques en barres et en courbes réservent un retrait de tracé fixe à l’intérieur de la boîte : 40 points à gauche, 20 en bas, 10 à droite, 10 en haut. L’aire de tracé restante met les valeurs à l’échelle linéairement par rapport au maximum de la série. Un maximum nul ou inférieur est mis à l’échelle par rapport à 1.0 à la place, si bien que des données entièrement nulles rendent les axes avec un contenu plat plutôt que de diviser par zéro. Les deux dessinent les axes X et Y à une largeur de 0.5 point et cinq graduations de valeur aux positions de quartile. Les graphiques en barres formatent les valeurs de graduation avec des suffixes K et M au-delà de mille et d’un million ; les graphiques en courbes impriment des nombres simples.

Chaque valeur occupe un emplacement égal sur la largeur du tracé. La barre remplit l’emplacement moins la fraction d’espacement configurée et est centrée dans l’emplacement. Les étiquettes de catégorie sont dessinées 12 points sous l’aire de tracé.

La grille, lorsqu’elle est activée, dessine quatre lignes horizontales de quartile en gris clair (0.85 0.85 0.85 RG) sous les axes et les séries. Chaque série dessine une polyligne à travers ses points, couvrant toute la largeur du tracé. Les marqueurs optionnels sont dessinés comme des cercles de Bézier à quatre segments à chaque point de données. Par défaut, les couleurs de série sont des entrées de palette consécutives dans l’ordre d’insertion.

Les secteurs sont disposés dans l’ordre des données, en partant de l’axe X positif et en balayant dans le sens antihoraire. Chaque tracé de secteur se ferme et se peint avec un remplissage et un trait combinés (h B) ; les arcs sont divisés en segments de Bézier d’au plus 90 degrés. Les étiquettes de pourcentage sont arrondies au pourcentage entier et ne sont rendues que sur les secteurs balayant plus de 15 degrés. La légende, lorsqu’elle est activée, réserve 80 points de la largeur de la boîte à droite et rend une pastille de 8 points par entrée à une hauteur de ligne de 12 points. Le rayon est la moitié de la plus petite valeur entre la largeur restante et la hauteur de la boîte, moins une marge de 10 points.

ChartBox est un rectangle immuable en unités utilisateur PDF (points) avec une origine en bas à gauche. ChartBox::fromUserSpace() convertit un rectangle d’origine en haut à gauche en le basculant par rapport à la hauteur de page fournie. inset() renvoie une nouvelle boîte, plus petite ; right() et top() sont des méthodes d’accès. ChartColor est autonome et ne dépend pas des classes de couleur de Core. Sa palette de 12 entrées attribue les couleurs de série et de secteur lorsque l’appelant n’en fournit aucune.

Matrice de prise en charge (appuyée par des preuves)

Section intitulée « Matrice de prise en charge (appuyée par des preuves) »

Un type de graphique ou une fonctionnalité obtient Vérifié uniquement lorsqu’un fixture pro/tests/** l’exerce. Aucune norme externe ne régit les graphiques, si bien que la preuve est une couverture comportementale de niveau unitaire.

Type de graphique / fonctionnalitéStatutPreuve (chemin de test)ConfianceNotes
Graphique en barres — rendu, axes, rectangles de barres, bornage d’espacement, données vides/toutes-nulles, formatage de valeur K/MVérifiépro/tests/Unit/Chart/BarChartTest.php; BarChartArithmeticCoverageTest.php; BarChartBoundaryCoverageTest.phpélevéeEnveloppe d’état graphique, lignes d’axe, proportions de hauteur de barre, nombre de graduations et bornes de formatage affirmés.
Graphique en courbes — série unique et multi-séries, tracé de ligne, axes, points, grille, point uniqueVérifiépro/tests/Unit/Chart/LineChartTest.php; LineChartCoverageTest.php; LineChartArithmeticCoverageTest.php; LineChartTypeCastCoverageTest.phpélevéeMulti-séries, point unique sans ligne, série vide, chemins de grille et de points couverts.
Graphique en secteurs — secteurs, segmentation de Bézier, pourcentages, légende, total nul/négatifVérifiépro/tests/Unit/Chart/PieChartTest.php; PieChartArithmeticCoverageTest.php; PieChartBoundaryCoverageTest.phpélevéeChemins de secteurs, nombre de segments par balayage, seuil d’étiquette à 15 degrés, géométrie de légende et comportement chaîne-vide couverts.
ChartBox — conversion de coordonnées (espace utilisateur vers PDF), haut/bas de page, dimensions nulles, retraitVérifiépro/tests/Unit/Chart/ChartBoxTest.phpélevéeConversion origine-en-haut-à-gauche vers origine-en-bas-à-gauche en haut, en bas et aux bords à dimension nulle de la page.
ChartColor — mise à l’échelle RGB, analyse hexadécimale, palette, opérateurs de trait/remplissageVérifiépro/tests/Unit/Chart/ChartColorTest.phpélevéeMise à l’échelle 0–255 vers 0–1, hexadécimal préfixé par # et nu, casse mixte, bouclage de palette après 12 entrées.
Durcissement de régression inter-moteurs de renduVérifiépro/tests/Unit/Chart/ChartCoverageTest.phpélevéeSuite de régression partagée sur les trois moteurs de rendu plus l’arithmétique de formatage de valeur.
Types de graphique au-delà de barres/courbes/secteurs (aires, nuage de points, empilé, anneau, etc.)Non pris en chargeélevéeAucun moteur de rendu n’est livré. La surface du module est exactement barres, courbes, secteurs. Dit honnêtement : ce n’est pas « tous les types de graphique ».

Compte honnête : Vérifié 6 lignes, Revendiqué 0, Non pris en charge 1 (tout type de graphique autre que barres, courbes, secteurs).

  • Aucun moteur de rendu ne lève sur les données. Une entrée dégénérée se dégrade en chaîne vide : des données de barres ou de courbes vides, une liste de séries vide et un total de secteurs inférieur ou égal à zéro renvoient tous ''.
  • Une série de courbe de moins de deux points ne dessine aucun tracé ni marqueur ; les axes et les étiquettes sont tout de même rendus.
  • Les valeurs de barre négatives ne sont pas rejetées ; le rectangle de barre s’étend sous l’axe X.
  • Le nombre d’étiquettes et de valeurs n’est pas validé de manière croisée. L’appelant fournit des listes de longueur correspondante.
  • Une ChartBox à dimensions nulles ou négatives est acceptée et produit une sortie dégénérée ; les appelants doivent dimensionner la boîte.
  • Les moteurs de rendu ne détourent pas. Un graphique surdimensionné, ses étiquettes de catégorie sous le tracé ou une longue légende peuvent déborder de la région de page prévue.
  • Une page dépourvue de police sous le nom de ressource de police du graphique laisse des opérateurs de texte référençant une ressource non définie ; le comportement du lecteur est alors indéfini.
  • ChartColor::hex() n’effectue aucune validation ; une entrée de moins de six chiffres décode les composantes absentes comme zéro. ChartColor::palette() échoue avec TypeError sur un index négatif, car le modulo négatif de PHP ne résout aucune clé de palette.
  • Le module n’effectue aucune cryptographie ; le mode FIPS n’a aucun comportement spécifique aux graphiques.

Le module Chart émet des opérateurs de flux de contenu PDF. Aucune norme externe de graphique, de symbologie ou de cryptographie ne régit sa sortie, si bien que la seule surface de conformité est le flux d’opérateurs émis.

RevendicationNormeClause
Les graphiques émis suivent le modèle d’opérateurs de flux de contenu ; la sortie s’imbrique dans un état graphique sauvegardé et restauré.ISO 32000-2§8.1
Les barres, lignes, secteurs et marqueurs sont des objets de chemin : la construction commence par m ou re et se conclut par un opérateur de peinture de chemin.ISO 32000-2§8.5.2
Les étiquettes sont rendues comme des objets de texte : la position est établie après BT, et les glyphes sont peints avec l’opérateur d’affichage de texte Tj.ISO 32000-2§9.2.2, §9.4.3

Toutes les clauses sont paraphrasées ; cette page ne reproduit aucun texte normatif. Ce sont des déclarations de capacité, non des certifications ; NextPDF ne détient aucune certification et n’en accorde aucune. Le rendu correct du flux dépend aussi du fait que le document englobant soit bien formé, ce qui relève de la responsabilité de l’auteur du document.

  • Les cinq classes portent @since 1.9.0 et sont à jour dans nextpdf/pro 3.1.0.
  • Le module est autonome : les moteurs de rendu ne dépendent que de ChartBox et ChartColor, sans couplage avec Core.
  • Une sortie déterministe maintient les documents comportant des graphiques reproductibles, stables au diff et sûrs à signer ou à archiver.
  • Enregistre une police sous le nom de ressource de police du graphique une fois par page hébergeant des graphiques.
  • Réutilise librement un moteur de rendu configuré sur plusieurs boîtes ; render() n’effectue aucune mutation d’état.
  • Les preuves de test se trouvent sous pro/tests/Unit/Chart/ ; la matrice de prise en charge ancre chaque ligne Vérifiée à sa suite.

Cette page ne documente que le comportement observable de l’extérieur et la surface d’API publique prise en charge. Les chemins d’espaces de noms internes, les classes d’assistance, les tables de mécanismes, les noms de fichiers de runbook et les préfixes de ticket sont hors périmètre.