Aller au contenu principal

Canevas

Un canevas est un élément Content avec un tableau shapes. Chaque entrée est une primitive de dessin unique (ligne, rectangle, cercle, chemin, texte, …) nommée selon son type de forme. La nomenclature et les propriétés reflètent les attributs de présentation SVG — les auteurs familiarisés avec SVG reconnaîtront cx/cy/r, x1/y1/x2/y2, d, fill, stroke.

Exemple en direct

Un vrai diagramme d'architecture réalisé comme un seul tableau shapes : un hexagone pour le service de périphérie, des rectangles arrondis pour le calcul, des cylindres ellipse-sur-rectangle pour les bases de données, des connecteurs codés par couleur. Ouvrez l'onglet Template pour voir le JSON.

Conteneur

{
"shapes": [ ... ],
"viewBox": [720, 240],
"padding": 0,
"style": "defaultShapeStyle"
}
PropriétéTypePar défautDescription
shapesarrayCommandes de dessin (voir ci-dessous).
viewBox[W, H]auto à partir des commandesRéservation explicite en points. Omettez pour dériver la boîte englobante serrée des commandes.
paddingnumber0Remplissage en points ajouté autour de la boîte englobante calculée automatiquement. Ignoré quand viewBox est défini.
stylestringStyle par défaut appliqué aux commandes qui ne portent pas le leur.

Les coordonnées sont relatives à la boîte, origine en haut à gauchex augmente vers la droite, y augmente vers le bas. Les commandes avec des coordonnées négatives sont décalées automatiquement dans la boîte quand viewBox est omis.

Formes intégrées

Chaque forme s'affiche de manière identique en PDF et DOCX — même JSON, même résultat.

NiveauFormes
Niveau 1 — primitivesrect, circle, ellipse, line, arc
Niveau 2 — polygonestriangle, diamond, pentagon, hexagon, octagon, plus, parallelogram, trapezoid
Niveau 3 — flèches directionnellesrightArrow, leftArrow, upArrow, downArrow, chevron
Personnalisépolygon — polygone fermé à N points, auto-fermé
Cheminspath — données SVG path arbitraires ; textPath — texte coulé le long d'un chemin
Contenutext, image, barcode
Groupementg — groupe les formes enfants sous une transformation + style en cascade ; use — instancie un composant graphique réutilisable

Chaque polygone et flèche s'adapte à la boîte englobante fournie via width × height ; le moteur de rendu dérive automatiquement les positions des sommets. Les commandes path / textPath acceptent les chaînes SVG d brutes, ce qui les rend les primitives les plus flexibles — tout ce que vous pouvez dessiner en SVG (courbes de Bézier, arcs, chemins composés, ornements décoratifs) se rend directement. Voir le tutoriel Galerie de motifs de canevas pour une référence complète des compositions décoratives (mandala, rayonnement, clé grecque, Lissajous, guilloché).

Commandes de dessin

Chaque commande est { "<nomForme>": { …props } } — une union discriminée nommée d'après la propriété de la forme. Chaque forme porte une référence style vers document.styles.

Primitives géométriques

Rectangle

{ "rect": { "x": 100, "y": 100, "width": 150, "height": 80, "rx": 6, "ry": 6, "style": "card" } }

rx / ry sont des rayons de coin optionnels — omettez-les pour des coins carrés.

Cercle

{ "circle": { "cx": 200, "cy": 100, "r": 30, "style": "node" } }

Ellipse

{ "ellipse": { "cx": 200, "cy": 100, "rx": 55, "ry": 6, "style": "dbCap" } }

Polygones Niveau 2

triangle, diamond, pentagon, hexagon, octagon, plus, parallelogram, trapezoid. Tous prennent x, y, width, height ; les sommets du polygone s'adaptent à cette boîte englobante.

{ "triangle": { "x": 0, "y": 0, "width": 80, "height": 80, "style": "shape" } }
{ "diamond": { "x": 110, "y": 0, "width": 80, "height": 80, "style": "shape" } }
{ "pentagon": { "x": 220, "y": 0, "width": 80, "height": 80, "style": "shape" } }
{ "hexagon": { "x": 330, "y": 0, "width": 80, "height": 80, "style": "shape" } }
{ "octagon": { "x": 0, "y": 100, "width": 80, "height": 80, "style": "shape" } }
{ "plus": { "x": 110, "y": 100, "width": 80, "height": 80, "style": "shape" } }
{ "parallelogram": { "x": 220, "y": 100, "width": 80, "height": 80, "style": "shape" } }
{ "trapezoid": { "x": 330, "y": 100, "width": 80, "height": 80, "style": "shape" } }

Flèches Niveau 3

rightArrow, leftArrow, upArrow, downArrow, chevron. L'orientation est encodée dans le nom ; le moteur de rendu ajuste les mathématiques des sommets en conséquence.

{ "rightArrow": { "x": 0, "y": 0, "width": 90, "height": 60 } }
{ "leftArrow": { "x": 110, "y": 0, "width": 90, "height": 60 } }
{ "upArrow": { "x": 220, "y": 0, "width": 60, "height": 90 } }
{ "downArrow": { "x": 290, "y": 0, "width": 60, "height": 90 } }
{ "chevron": { "x": 360, "y": 0, "width": 80, "height": 60 } }

Nœuds étiquetés (regrouper une forme + étiquette)

Un nœud de diagramme — une forme avec une étiquette centrée — est un groupe g : la forme plus un text centré dans la même boîte. Les enfants se dessinent dans les coordonnées locales du groupe, donc translate place le nœud et le style du groupe se propage en cascade aux enfants qui ne déclarent pas le leur (ici, la forme hérite du remplissage du nœud tandis que l'étiquette conserve son propre style de texte blanc).

{ "g": {
"translate": [30, 85],
"style": "node",
"shapes": [
{ "hexagon": { "x": 0, "y": 0, "width": 110, "height": 50 } },
{ "text": { "x": 0, "y": 20.5, "width": 110, "text": "API Gateway", "style": "nodeLabel" } }
]
} }

Centrez l'étiquette verticalement avec y = height/2 − fontSize/2. Quand le même nœud réapparaît à travers un diagramme (le cas courant), définissez-le une fois comme un composant graphique et use le avec data par instance — voir order-lifecycle-states.json et org-chart.json.

Exemple en directarchitecture-diagram.json (un nœud de périphérie hexagone en tant que g, plus quatre composants arch-node instanciés via use).

Polygone

Polygone fermé défini par N points. Utile pour les étoiles, les badges, les formes de diagramme de flux personnalisées. Auto-fermé (dernier sommet revenant au premier).

{
"polygon": {
"points": [
{ "x": 100, "y": 10 },
{ "x": 140, "y": 40 },
{ "x": 125, "y": 90 },
{ "x": 75, "y": 90 },
{ "x": 60, "y": 40 }
],
"style": "star"
}
}

Lignes et arcs

Ligne

{ "line": { "x1": 50, "y1": 50, "x2": 200, "y2": 150, "style": "connector" } }

Arc

Balayage de startAngle à endAngle (degrés, CCW depuis +x) autour de (cx, cy).

{ "arc": { "cx": 200, "cy": 200, "r": 60, "startAngle": 0, "endAngle": 180, "style": "arc" } }

Chemins et texte sur chemin

Chemin

Données SVG path arbitraires via l'attribut d. Supporte les commandes SVG standard : M/m (moveto), L/l (lineto), H/h / V/v (horizontal/vertical lineto), C/c / S/s (courbe de Bézier cubique + lisse), Q/q / T/t (courbe de Bézier quadratique + lisse), A/a (arc elliptique), Z/z (fermer le chemin). Traits et/ou remplissages basés sur les propriétés de couleur fournies par le style (stroke → trait, fill → remplissage, les deux → remplissage+trait).

{ "path": { "d": "M 0 50 Q 100 0 200 50 T 400 50", "style": "wave" } }

Cercle complet comme deux arcs semi-circulaires :

{ "path": { "d": "M 100 6 A 94 94 0 0 1 100 194 A 94 94 0 0 1 100 6", "style": "outerRing" } }

textPath

Coule du texte le long d'un chemin avec rotation par glyphe. Le chemin lui-même n'est pas dessiné — appairez avec une commande path utilisant le même d si vous voulez une courbe visible aussi.

PropriétéTypeDescription
dstringDonnées SVG path (même syntaxe que path).
textstringTexte à couler ; supporte les Codes courts ([b], [i], [color], [fontsize], [caps], [font, Family], …). Façonné au moment du rendu — les scripts complexes se joignent/empilent correctement (voir Texte multi-script et sceaux).
alignmentenumstart (par défaut) · middle · end — ancre le texte le long du chemin.
startOffsetnumberDistance en points depuis le début du chemin avant le premier glyphe.
sideenumabove (par défaut) — ligne de base sur le chemin ; below — le glyphe pend sous le chemin.
stylestringStyle de texte du canevas.
{
"textPath": {
"d": "M 24 100 A 76 76 0 0 1 176 100",
"text": "OFFICIAL · [color, #7A1F2E]STATE CORPORATION COMMISSION[/color]",
"alignment": "middle",
"style": "sealTopText"
}
}

Contenu

Texte

{ "text": { "x": 150, "y": 200, "text": "Section header", "style": "label" } }

Quand width est défini, (x, y) est le coin supérieur gauche d'une boîte de texte et le textAlign du style centre/aligne à droite le texte dans cette boîte. Sans width, l'ancre est le pivot d'alignement — l'alignement au centre pivote sur (x, y), l'alignement à droite se termine à cet endroit.

{ "text": { "x": 0, "y": 10, "width": 180, "text": "EDGE", "style": "laneHeader" } }

Définissez fontFamily sur le style de texte pour utiliser une police personnalisée intégrée, et changez de police au milieu de la chaîne avec le Code court [font, Family] — à la fois text et textPath sont façonnés au moment du rendu (voir Texte multi-script et sceaux).

Image

{ "image": { "x": 50, "y": 30, "width": 100, "height": 40, "href": "images/logos/acme.png" } }

Code-barres

Placez n'importe quelle symbologie de code-barres prise en charge aux coordonnées du canevas — PDF417, DataMatrix, QR, Code128, Code39, MaxiCode et les codes spécialisés 2D. L'encodeur de code-barres s'exécute au moment du rendu, donc la valeur codée peut être une référence $data.*.

{
"barcode": {
"x": 80, "y": 56,
"width": 40, "height": 40,
"spec": { "type": "datamatrix", "code": "$data.credential.payload" }
}
}
PropriétéTypeDescription
x, ynumberCoin supérieur gauche du code-barres dans les coordonnées du canevas.
width, heightnumberDimensions de rendu en points. Pour les codes 2D carrés, définissez les deux égaux. Omettez pour utiliser les valeurs par défaut par symbologie.
spec.typestringSymbologie — datamatrix, qrcode, pdf417, code128, code39, aztec, maxicode, microqr, rmqr, micropdf417, dotcode, hanxin, code16k, codablockf, ultracode, gridmatrix, upnqr et tous les types linéaires 1D. Voir Symbologies.
spec.codestringLa charge utile à encoder. Supporte les références $data.* et $item.*.

Ceci est la primitive de code-barres du canevas — distincte du Code court [barcode, …] qui s'affiche en ligne avec le flux de texte. Utilisez la forme du canevas quand vous avez besoin du code-barres à un emplacement précis aux côtés d'autres formes du canevas (le centre d'un sceau, un coin d'un formulaire, une barre latérale de bord).

Exemples en directofficial-seal.json (enregistrement de vérification PDF417 à côté des numéros de contrôle), graduation-certificate.json et achievement-certificate.json (DataMatrix au centre visuel d'un sceau académique), stock-certificate.json (badge de vérification DataMatrix), void-check.json (filigrane Code128 monté sur bord).

Texte multi-script et sceaux

Canvas text et textPath sont façonnés avec HarfBuzz au moment du rendu — le même moteur qui façonne les paragraphes coulants. L'arabe et l'hébreu se joignent dans leurs formes contextuelles et s'affichent de droite à gauche, le Devanagari construit des conjonctifs, le thaï empile les marques de voyelle et de ton, et le chinois/japonais/coréen s'affichent à partir d'une famille CJK. Choisissez la police avec fontFamily sur le style de texte du canevas, et changez de polices par passage avec le Code court [font, Family]. Chaque anneau textPath peut donc porter un script différent — ce qui rend un sceau multi-script possible.

Exemples en directworld-languages-proclamation.json (un sceau de canevas portant l'arabe, le latin, le grec et le Devanagari sur des anneaux textPath concentriques autour d'un caractère CJK) et multilingual-device-guide.json (anneaux extérieurs latin + CJK, anneaux intérieurs Devanagari + thaï autour d'un caractère CJK gras). Voir Polices personnalisées pour les détails de façonnage et de sous-ensemble.

Styles de canevas

Les formes du canevas utilisent un schéma de propriété différent des styles de paragraphe. Utilisez les clés ci-dessous — color/backgroundColor/border sont des propriétés de paragraphe et seront silencieusement ignorées sur les commandes de forme.

La nomenclature s'aligne avec les attributs de présentation SVG. Mêmes sémantiques que SVG, camelCase de style JSON.

PropriétéS'applique àDescription
fillformesRemplissage intérieur.
strokeformes, lignes, cheminsCouleur de bordure / ligne / trait.
strokeWidthformes, lignes, cheminsLargeur du trait en points.
strokeDasharrayformes, lignes, cheminsMotif de tiret en tant que tableau numérique : [on, off] pour tiret simple, [a, b, c, d, …] pour tiret-point, [0.5, 2.5] associé à strokeLinecap: "round" pour pointillé. Utilisez [0] ou [] pour réinitialiser explicitement à solide — l'état du canevas PDF est collant, donc un motif de tiret défini plus tôt dans le flux de commande persiste jusqu'à ce qu'il soit remplacé.
strokeDashoffsetcheminsDécalage de départ dans le motif de tiret (par défaut 0).
strokeLinecapformes, lignes, cheminsbutt (par défaut) / round / square — forme de terminaison de ligne. Combiné avec strokeDasharray, round transforme les minuscules segments activés en points ronds au lieu de carrés de pixels.
strokeLinejoincheminsmiter (par défaut) / round / bevel — style de jointure d'angle aux sommets des polylignes.
strokeMiterlimitcheminsFlottant positif — contrôle la longueur d'une pointe d'onglet avant d'être coupée à un biseau.
opacitytous0.01.0 transparence.
colortexte, textPathCouleur de remplissage du texte.
fontSizetexte, textPathTaille du texte en points.
fontWeight / fontStyletexte, textPathPoids (bold, normal, 100900) et style (italic, normal).
fontFamilytexte, textPathFamille de polices pour les polices personnalisées intégrées.
letterSpacingtexte, textPathSuivi inter-caractères en points (positif élargit, négatif resserre).
textAligntexteleft / center / right — le domaine est le width du texte quand défini, le point d'ancrage sinon.
textRenderingModetexte, textPathfill (par défaut) / stroke / fillstroke / invisible / fillclip / strokeclip / fillstrokeclip / clip.
skewchemins[skewX] ou [skewX, skewY] en degrés — applique une transformation d'inclinaison 2D.
transformcheminsMatrice affine à 6 éléments [a, b, c, d, e, f]ConcatMatrix brut.
rotateformesRotation en degrés autour du centre de la forme.
{
"styles": {
"card": { "fill": "#1E40AF", "stroke": "#1E3A8A", "strokeWidth": 0.5 },
"cardLabel": { "fontSize": 9, "fontWeight": "bold", "color": "#FFFFFF", "textAlign": "center" },
"connector": { "stroke": "#16A34A", "strokeWidth": 1.5 }
}
}

Symboles et réutilisation — use

Dessinez un graphique une fois, instanciez-le plusieurs fois. Un composant graphique est un document dont le contenu est un seul canevas ; une commande use l'estampe dans un autre canevas dans une boîte de destination, le mise à l'échelle à partir du viewBox du composant et en liant les données par instance.

Déclaration d'un composant graphique

Un composant est un fichier de document ordinaire avec un handle metadata.name et une charge utile de canevas. Le name est ce que les auteurs référencent — il est indépendant du nom du fichier et du dossier.

{
"component": {
"metadata": { "name": "quality-seal" },
"styles": {
"sealOuter": { "stroke": "#10243E", "strokeWidth": 2 },
"sealGrade": { "fontSize": 46, "fontWeight": "bold", "color": "#10243E", "textAlign": "center" }
},
"content": [
{
"viewBox": [150, 150],
"shapes": [
{ "circle": { "cx": 75, "cy": 75, "r": 72, "style": "sealOuter" } },
{ "text": { "x": 0, "y": 45, "width": 150, "text": "$data.grade", "style": "sealGrade" } }
]
}
]
}
}

$data.grade est un placeholder rempli par instance (voir Liaison de données). Les styles nommés du composant le voyagent — ils se résolvent dans quel que soit le document qui le use.

Instanciation avec use

À l'intérieur de n'importe quel canevas, une commande use nomme le composant et donne une boîte de destination. width/height mettent à l'échelle le composant à partir de son viewBox ; data fournit les valeurs de cette instance.

{
"viewBox": [472, 175],
"shapes": [
{ "use": { "name": "quality-seal", "x": 16, "y": 12, "width": 150, "height": 150, "data": { "grade": "A" } } },
{ "use": { "name": "quality-seal", "x": 206, "y": 27, "width": 120, "height": 120, "data": { "grade": "B" } } },
{ "use": { "name": "quality-seal", "x": 372, "y": 39, "width": 100, "height": 100, "data": { "grade": "A+" } } }
]
}

Une définition, trois tailles, trois notes — pas de géométrie dupliquée. Les anneaux, le texte et les formes imbriquées s'échellent en tant qu'unité.

Champ useSignification
nameLe metadata.name du composant (le handle que les auteurs écrivent).
idÉpingle GUID optionnelle ; gagne sur name quand les deux sont présents.
x / yCoin supérieur gauche de destination, dans les coordonnées du canevas hôte.
width / heightTaille de destination ; l'échelle est dérivée par rapport au viewBox du composant.
dataValeurs par instance liées aux placeholders $data.* du composant.
rotate / skew / transformTransformations optionnelles appliquées à l'instance (degrés / degrés / matrice 6 éléments).
styleStyle nommé en cascade vers les formes de l'instance qui ne déclarent rien.

Les transformations se composent dans l'ordre SVG (translate → rotate → skew → scale, puis la matrice transform brute). Les composants peuvent use d'autres composants ; l'imbrication est limitée en profondeur avec une garde de cycle.

Note DOCX. Dans la sortie Word, un use devient un groupe imbriqué portant translate, scale et rotate. Les transformations skew et raw-matrix ne sont pas exprimables sur un groupe Word et sont supprimées (le PDF les honore dans leur intégralité), et un groupe pivoté pivote sur son centre plutôt que sur son coin supérieur gauche.

Galerie de motifs — chemins, courbes et textPath

Un deuxième exemple en direct exerçant l'extrémité plus décoratively de l'API du canevas : données SVG path, courbes de Bézier quadratiques et cubiques, arcs, textPath (texte coulé le long d'une courbe), formes polygon et compositions se chevauchant. Utile comme référence lors de la création de sceaux, de bordures ornementales, d'illustrations mathématiques/géométriques ou de n'importe quoi où le langage de mise en page est « placer ces courbes exactement ici ».

Prochaines étapes

  • Filigranes — superpositions de texte/image translucides qui se répètent sur les pages.
  • Tableaux — mises en page tabulaires qui coulent avec les paragraphes.
  • Colonnes — mises en page de flux multi-colonnes.