Un tableau qui se poursuit de page en page
Des lignes et des colonnes qui coulent sur autant de pages qu'il faut, avec en-tête répété, filets, fonds de couleur et cellules fusionnées.
Résumé
Le tableau que vous connaissez déjà, avec un texte, un prix ou une image dans chaque cellule. Vous choisissez la largeur des colonnes : une taille fixe, une part de ce qui reste, ou juste ce qu'il faut pour le contenu. Qui tombe au milieu d'un tableau long sait toujours ce qu'il lit, parce que la ligne d'en-tête s'imprime de nouveau en haut de chaque page. Les filets, les fonds gris ou colorés et les cellules réunies en une seule se demandent en une seule phrase, pour tout le tableau à la fois.
Techniquement
Demandé avec
"type": "table"
Un article table décrit ses colonnes, ses rangées, et les deux boîtes dans lesquelles il coule : celle de la première page et celle des suivantes. Les largeurs se disent en points, en fraction de l'espace restant, ou se mesurent sur le contenu même des cellules. Un nombre de rangées de tête et de pied se répète sur chaque page. Les filets se déclarent par motif — le cadre, une ligne donnée, toutes les autres horizontales, une colonne comptée depuis la fin — et les fonds par zone, avec une priorité claire : une zone nommée l'emporte sur l'en-tête et le pied, qui l'emportent sur les rangées paires ou impaires, qui l'emportent sur le tableau entier ; à égalité, la dernière déclaration gagne, et le fond posé sur une cellule ou sur une rangée passe devant tout le reste. Une cellule contient un texte, une image, un dessin déclaré ou une page d'un PDF fourni, et couvre plusieurs colonnes ou plusieurs rangées. On peut aussi autoriser le tableau à couper au milieu de son texte une rangée trop haute pour sa boîte, au lieu de la faire passer entière à la suivante ; là où c'est le cas, une cellule dit avec keep_lines combien de lignes d'un de ses paragraphes doivent rester de chaque côté de cette coupure, pour que la coupure ne laisse jamais de ligne orpheline ni de ligne veuve dans une boîte de tableau.
Schéma de la requête
Clés obligatoires : columns, objet à widths (tableau de {"points": n}, {"fraction": n}, "content" ou "longest_word") et total (nombre) ; rows, tableau de rangées ; first et next, deux rect. Facultatives : header et footer, entiers à 0 ; row_headers, entier à 0, combien de colonnes de tête sont l'en-tête de leur rangée, pour qu'un chiffre lu à voix haute soit annoncé sous l'entrée en face de laquelle il se trouve ; header_links, valant deduced, always ou never, qui dit si les cellules nomment les en-têtes sous lesquels elles se trouvent — absent, tout se passe comme sous deduced, qui ne les nomme que là où la lecture d'un tableau prévue par la norme ne peut pas dire quel en-tête atteint quelle cellule : un en-tête fusionné sur plusieurs colonnes ou rangées, un en-tête hors des rangées et des colonnes de tête, ou une rangée plus courte que le tableau n'est large ; always fait nommer l'en-tête par chaque cellule à laquelle il s'applique, et never n'en fait nommer aucun ; branch, l'étiquette sous laquelle l'arbre de structure tient le tableau ; fill_frame (défaut false), qui dit si les rangées de corps se partagent la place que la boîte laisse sous elles, pour que la dernière finisse sur le plancher de la boîte, l'en-tête et le pied gardant la hauteur qu'il leur faut ; corners, nombre, le rayon en points auquel les quatre coins du cadre du tableau sont arrondis, le cadre étant alors dessiné comme un seul contour fermé, si bien qu'un tableau dont les traits ne dessinent aucun frame, ou dont les traits prennent l'une des quatre lignes extérieures par son numéro, est refusé, un rayon de zéro dessinant le cadre comme il l'est sans cette clé ; split_rows (défaut false), qui dit si une rangée de corps trop haute pour sa boîte est coupée à une ligne de son texte au lieu d'être refusée ; rules, tableau d'objets {"rule": …, "stroke": …} où le motif vaut "frame", {"horizontal": n}, {"horizontal_from_end": n}, "horizontal_other", {"vertical": n}, {"vertical_from_end": n} ou "vertical_other" ; fills, tableau d'objets {"area": …, "color": …} où la zone vaut "whole", "header", "footer", "even_rows", "odd_rows", {"row": n}, {"row_from_end": n}, {"column": n} ou {"column_from_end": n} ; id ; start, valant {"page": n}, "on_new_page" ou {"relative_to": …} (défaut : la première page) ; layer. Une rangée : cells obligatoire ; min_height, space (before, after, défaut 0), keep_with_next (défaut false) et fill facultatifs. Une cellule contient exactement un contenu parmi le texte (content, tableau de chaînes, avec font et font_size), image, drawing et pdf (avec page, entier, défaut 1) ; deux contenus, ou aucun, sont refusés. Autres clés de cellule, toutes facultatives : align, overlong, border (top, bottom, left, right, chacun un trait), fill, color, padding et margin (left, right, top, bottom, défaut 0), span et row_span (défaut 1), valign (top par défaut, middle, bottom), leading (défaut 1,2 × la taille), leader, align_on (un caractère), heading (row, column ou both : la cellule est l'en-tête du reste de sa rangée, du reste de sa colonne, ou des deux ; lu là où le tableau porte branch), keep_lines (un nombre entier supérieur à zéro ; absent, le nombre que garde le moteur, celui qu'un bloc de texte nomme séparément orphans et widows). keep_lines ne se lit que là où le tableau coupe une rangée de corps à une ligne de son texte, et une cellule qui contient autre chose que du texte n'en est pas changée ; un nombre qu'aucune boîte du parcours ne peut honorer est abandonné, et la rangée est coupée là où elle l'aurait été sans lui. Un keep_lines valant zéro est refusé.
Une requête entière qui crée un PDF
{
"standard_fonts": [{"name": "sans", "face": "helvetica"}],
"items": [
{
"type": "table",
"columns": {"widths": [{"fraction": 1.0}, {"points": 80}], "total": 451},
"first": {"llx": 72, "lly": 600, "urx": 523, "ury": 780},
"next": {"llx": 72, "lly": 72, "urx": 523, "ury": 780},
"header": 1,
"header_links": "deduced",
"branch": "lines",
"split_rows": true,
"fills": [{ "area": "header", "color": [0.93, 0.94, 0.97] }],
"rules": [{"rule": "frame", "stroke": {"width": 0.8}}],
"rows": [
{"cells": [
{
"content": ["Description"],
"font": "sans",
"font_size": 10,
"valign": "middle"
},
{"content": ["Amount"], "font": "sans", "font_size": 10, "align": "right"}
]},
{"cells": [
{"content": ["Rendering engine"], "font": "sans", "font_size": 10,
"keep_lines": 3, "heading": "row"},
{"content": ["4 250.00"], "font": "sans", "font_size": 10, "align": "right"}
]}
]
}
],
"structure": {
"lang": "en-GB",
"children": [{"tag": "Document", "children": [{"branch": "lines"}]}]
}
}
Où aller ensuite
Toutes les clés JSON d'une requête, en une page Les vingt-deux autres choses que l'on peut dessiner