Ce dont le document dit être fait

Donnez au document un ordre de lecture et une forme, pour qu’un programme le lise à voix haute dans l’ordre où une personne le lirait.

Le résultat dans un vrai PDF

Une liste dont les images parlent aussi

Une liste de pièces dont la première colonne est une image plutôt qu’un mot. Chaque image donne la phrase qu’on entend à sa place, si bien que rien de cette liste n’échappe à qui ne la voit pas. Sur la page, les images restent de simples images.

Ouvrir le PDF Voir l’exemple complet

Également dans les exemples : Un document qui se lit à voix haute · Un montant qui dit de quels titres il dépend · Acte de dépôt balisé en PDF/A-1a

Résumé

L’encre sur une page n’a pas d’ordre à elle. Une personne voit que les mots en gros caractères du haut sont un titre et que les deux colonnes se lisent l’une après l’autre, mais un programme ne voit que des marques posées à des coordonnées, dans l’ordre où elles ont été dessinées. Une fois que c’est écrit, un document se lit correctement à voix haute, se copie sans se mélanger, et se réagence sur un petit écran. On peut aussi dire qu’un passage est dans une autre langue, pour qu’il soit prononcé comme il faut, et donner à une image une phrase qui la décrit pour quelqu’un qui ne la voit pas.

Techniquement

Écrit au premier niveau d’une requête, sous "structure"

structure écrit le /StructTreeRoot et l’arbre de /StructElem en dessous — ce dont le document dit être fait, dans l’ordre de lecture : les éléments de structure qui contiennent le contenu marqué que les éléments ont laissé dans le flux de contenu. Un élément ouvre un contenu marqué avec tag et mark ; l’arbre le revendique ensuite par son /MCID, et c’est ce qui lie l’encre au sens. Absent, le fichier ne dit rien de lui-même et le logiciel de lecture le lit dans l’ordre où l’encre a été déposée. lang est la langue dans laquelle les mots sont écrits, sous forme d’étiquette BCP 47, et un nœud déclare la sienne quand un passage est écrit dans une autre. roles permet à la requête d’employer ses propres balises, chacune rattachée par /RoleMap à une balise que la norme nomme. Un nœud soit contient des enfants, soit réclame du contenu marqué par content, soit atteint une branche construite ailleurs.

Schéma de la requête

  • structure — objet, facultatif. Absent, le fichier ne dit rien de lui-même.
  • structure.lang — chaîne, facultative, une étiquette BCP 47. La langue dans laquelle les mots du document sont écrits.
  • structure.roles — tableau, facultatif. Des balises propres à la requête, chacune un objet fait de tag et de standard, la balise de la norme à laquelle elle équivaut.
  • structure.children — tableau, facultatif. Les éléments au premier niveau de l’arbre, dans l’ordre de lecture.
  • Un nœud nomme soit branch, le nom d’une branche construite ailleurs, et rien d’autre du tout ; soit tag, le nom que la norme donne à ce qu’il est (Document, Sect, H1, P, Figure), puis children, d’autres nœuds, ou content, l’étiquette du contenu marqué qu’un élément a laissé derrière lui — l’un des deux, jamais les deux. Un nœud qui ne nomme ni tag ni branche est refusé.
  • Un nœud prend aussi namespace, lang pour un passage dans une autre langue, alt, une phrase décrivant ce qu’on ne peut pas voir, et actual_text, ce qu’un passage dit vraiment quand son encre ne l’épelle pas.
  • Un nœud prend aussi expansion, les mots qu’une abréviation ou un sigle abrège, écrits en toutes lettres, qu’un logiciel de lecture dit à la place des lettres.
  • Un nœud prend aussi list_numbering sur le nœud d’une liste, parmi none, unordered, description, disc, circle, square, ordered, decimal, upper_roman, lower_roman, upper_alpha et lower_alpha. Une liste imbriquée qui ne donne aucune numérotation prend celle de la liste qui la contient, si celle-ci en donne une.
  • Un nœud prend aussi placement, la place de l’élément dans le fil de sa page, parmi block, inline, before, start et end. Sans lui, l’élément est un bloc ou se tient dans sa ligne, selon ce qu’est sa balise. Rien ne bouge sur la page : il dit à un logiciel qui réagence le document où remettre l’élément.
  • structure.namespace_roles — tableau, facultatif. Des balises d’un espace de noms lues comme des balises d’un autre, chacune un objet de namespace, tag, standard et target_namespace : le tag de namespace se lit comme standard de target_namespace. C’est ce qui permet à deux espaces de noms d’employer un même nom pour deux choses différentes. PDF 2.0.
  • structure.pronunciation_lexicons — tableau de chaînes, facultatif. Les name de fichiers pris parmi les attachments, chacun un lexique de prononciation au format du W3C, avec lesquels le logiciel de lecture prononce les mots du document, la première correspondance l’emportant. Un nom qu’aucune pièce jointe ne déclare est refusé.
  • Un nœud prend aussi aria_role, ce à quoi sert l’élément là où les balises de la norme n’ont pas de mot pour le dire, sous la forme d’un rôle de WAI-ARIA 1.1 ou de son module Digital Publishing, écrit comme l’écrit ce vocabulaire : doc-bibliography, doc-noteref, "alertdialog". "none" se lit comme "presentation". Un mot que le vocabulaire ne contient pas, ou l’un de ses rôles abstraits, est refusé.
  • Un nœud prend aussi phoneme, la façon dont son contenu se prononce, écrite dans un alphabet phonétique, et phonetic_alphabet, cet alphabet, que reprennent les nœuds qu’il contient quand ils n’en donnent aucun : ipa, x_sampa, pinyin, wade_giles, ou {"other": name} pour un alphabet que la norme ne nomme pas. Absent, le logiciel de lecture prend l’alphabet phonétique international.
  • Le nœud d’une liste prend aussi continues_list, la liste antérieure qu’il poursuit : "preceding", la liste qui le précède dans l’arbre, ou {"from": id}, la liste dont l’id est donné. Un id qu’aucun nœud n’a est refusé.
  • Un nœud "Form" qui entoure un champ de formulaire imprimé prend aussi print_field, un objet de role (radio_button, check_box, push_button, text_value ou list_box), checked (on, off ou neutral) et description, le nom de remplacement du champ, chacun écrit seulement là où il est donné.
  • Un nœud "Artifact" accepte aussi artifact, qui décrit l’habillage qu’il entoure. Cet objet contient : kind (pagination, layout, page ou inline) ; subtype, écrit comme dans le fichier (Header, Footer, Watermark, PageNum, Bates, LineNum, Redaction, ou un nom personnalisé conforme à l’annexe E de l’ISO 32000-2, comme ACME_Stamp) ; et bbox, la zone couverte, donnée par ses quatre bords en points dans le repère de la page. Chacune de ces trois clés n’est écrite que si elle est donnée. Tout autre sous-type est refusé.
  • Un nœud prend aussi refers_to, l’id des nœuds auxquels il renvoie — une note à ce qu’elle commente, une légende à ce qu’elle légende. Un id qu’aucun nœud n’a est refusé.
  • Un nœud prend aussi attributes, les objets d’attributs qu’il déclare pour dire ce que signifie son apparence, comme le cadre qu’occupe une figure, l’alignement d’une cellule ou l’épaisseur d’une bordure. Chacun est un objet de owner (ou namespace), entries et revision : owner, le nom que la norme donne à la famille dont il relève (Layout, List, PrintField, Table, UserProperties) ou un nom choisi librement ; namespace, à sa place en PDF 2.0, l’adresse d’un vocabulaire propre ; entries, chaque valeur sous son nom ; revision, facultatif, la révision de l’élément auquel l’objet se rattache. Une valeur est true ou false, un nombre, une chaîne, un tableau de valeurs, {"name": "Center"} pour un nom ou {"dictionary": {…}} pour des valeurs rangées chacune sous son nom. Un objet qui déclare à la fois owner et namespace, ou ni l’un ni l’autre, est refusé.
  • structure.class_map — tableau, facultatif. Les classes : des objets d’attributs rangés une fois pour toutes sous un nom. Chaque classe est un objet de name et attributes, ce dernier écrit comme celui d’un nœud. Un nœud prend aussi classes, les classes auxquelles il appartient, chacune un objet de name et revision, ce dernier facultatif ; les objets d’attributs de ces classes comptent comme les siens.
  • Une cellule d’un tableau décrit nœud par nœud, un "TH" ou un "TD", prend aussi scope (row, column ou both, sur un "TH"), col_span et row_span, les colonnes et les rangées qu’elle couvre, la sienne comprise, et headers, l’id des cellules d’en-tête sous lesquelles elle se trouve.
  • Un nœud qui contient children ou content prend aussi annotations, le mark d’un élément link ou un champ de formulaire, si bien que l’élément contient ce lien ou ce champ, et que le lien renvoie à lui : ce qu’un document revendiquant pdfua1 ou pdfua2 doit à chaque lien et à chaque champ. Un groupe de boutons radio range une entrée par bouton sous son étiquette.
  • Un nœud prend aussi imported_runs, les passages d’une page reprise par un élément pdf_page : {"page": label, "runs": [0, 1]}, l’étiquette own_runs de cet élément et les numéros que son document d’origine a donnés aux passages. annotations et imported_runs sont refusés sur un nœud dont le content nomme plusieurs passages.
  • Un élément qui dessine, là où aucun élément de l’arbre ne possède son passage, prend described, ce que le passage dit de lui-même : un objet de expansion, actual_text, alt et lang, l’un au moins donné. Il est refusé à côté de tag ou d’artifact, et dans un dessin nommé.

Portée : le document entier. C’est à son aune qu'accessible est jugée ; seule, elle ne coûte rien, et quiconque veut l’ordre et le sens plutôt que les coordonnées peut simplement la lire.

Une requête entière qui crée un PDF

{
  "standard_fonts": [{ "name": "sans", "face": "helvetica" }],
  "structure": {
    "lang": "en-GB",
    "children": [
      {
        "tag": "Document",
        "children": [
          { "tag": "H1", "content": "heading" },
          { "tag": "P", "content": "opening" },
          {
            "tag": "L",
            "list_numbering": "decimal",
            "children": [
              {
                "tag": "LI",
                "children": [
                  { "tag": "Lbl", "content": "label" },
                  {
                    "tag": "LBody",
                    "children": [
                      {
                        "tag": "Span",
                        "expansion": "kilogramme",
                        "content": "unit"
                      },
                      {
                        "tag": "Span",
                        "placement": "inline",
                        "content": "rest"
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  },
  "items": [
    {
      "type": "text",
      "rect": { "llx": 72, "lly": 720, "urx": 523, "ury": 760 },
      "content": ["What this document is"],
      "font": "sans",
      "font_size": 20,
      "tag": "H1",
      "mark": "heading"
    },
    {
      "type": "text",
      "rect": { "llx": 72, "lly": 660, "urx": 523, "ury": 710 },
      "content": ["It is read in the order the tree gives, not the order of the ink."],
      "font": "sans",
      "font_size": 11,
      "tag": "P",
      "mark": "opening"
    },
    {
      "type": "text",
      "rect": { "llx": 72, "lly": 620, "urx": 96, "ury": 646 },
      "content": ["1."],
      "font": "sans",
      "font_size": 11,
      "tag": "Lbl",
      "mark": "label"
    },
    {
      "type": "text",
      "rect": { "llx": 100, "lly": 620, "urx": 112, "ury": 646 },
      "content": ["kg"],
      "font": "sans",
      "font_size": 11,
      "tag": "Span",
      "mark": "unit"
    },
    {
      "type": "text",
      "rect": { "llx": 115, "lly": 620, "urx": 523, "ury": 646 },
      "content": ["of paper per ream"],
      "font": "sans",
      "font_size": 11,
      "tag": "Span",
      "mark": "rest"
    }
  ]
}

La ligne qui l’envoie, en trois langages

S’y retrouver

L’ordre du passage d’un champ au suivant Ce qu’une page déclenche à l’arrivée et au départ Fermer, enregistrer, imprimer : ce qu’exécute le document Les scripts que le document enregistre sous un nom Le sommaire cliquable sur le côté Des points d’arrivée qui ont un nom Suivre un article de colonne en colonne Comment le document s’ouvre et s’imprime

Où aller ensuite

Toutes les clés JSON d’une requête, en une page Les quarante et un autres réglages d’une requête

Voir les prix Voir les exemples