Une police derrière la police

Une ligne d'états composée deux fois : avec la police d'entreprise seule, où les marques dont elle n'a pas le dessin sortent en cases vides, puis avec une seconde police derrière elle qui les dessine.

Cette page est le programme entier, pour celui qui écrit vos logiciels. Il n'y a rien d'autre à y lire. Revenir au document qu'il écrit.

JSON write_font_fallback.json 171 lignes

Celui-ci n'est pas un programme. C'est la requête envoyée au serveur de documents : la même page, demandée par le réseau, par une application qui n'écrit pas une ligne de code PDF.

Cette demande écrit noir sur blanc trois chiffres que la bibliothèque lit toute seule : que la ligne est coupée en sept tronçons par les deux caractères réunis, et les deux noms que ces caractères se donnent. Le compte bouge dès que la ligne bouge ou que l'un des deux caractères couvre autre chose, et les noms bougent dès que l'un des deux fichiers est remplacé ; ici ils sont tapés à la main, et il faudrait les retaper. Deux des trois colonnes du bas reçoivent un rectangle qui dépasse le bord droit de la feuille, sans dommage : rien de ce qu'elles contiennent n'est assez large, même de loin, pour se couper.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
{
  "font_chains": [
    {"name": "chained", "faces": ["plex", "DejaVuSans"]}
  ],
  "items": [
    {
      "type": "text",
      "rect": {"llx": 60, "lly": 758.4, "urx": 535, "ury": 780},
      "content": ["A font behind the font"],
      "font": "plex",
      "font_size": 18
    },
    {
      "type": "text",
      "rect": {"llx": 60, "lly": 694, "urx": 535, "ury": 750},
      "content": ["A house font rarely covers every character a document has to draw. Without a second font behind it, a character it has no glyph for comes out as the empty box below, and a reader is left guessing.\nA chain hands that character to the next font instead, so the line is set in as many fonts as it takes and every mark is drawn."],
      "font": "chained",
      "font_size": 10,
      "leading": 14
    },

    {
      "type": "text",
      "rect": {"llx": 60, "lly": 639.2, "urx": 535, "ury": 650},
      "content": ["The house font alone: what it has no glyph for, it cannot draw."],
      "font": "plex",
      "font_size": 9
    },
    {
      "type": "text",
      "rect": {"llx": 60, "lly": 598, "urx": 535, "ury": 616},
      "content": ["✓ Paid · ★ Priority · ☂ Weather hold · ✗ Refused"],
      "font": "plex",
      "font_size": 15
    },

    {
      "type": "text",
      "rect": {"llx": 60, "lly": 549.2, "urx": 535, "ury": 560},
      "content": ["The house font, with a second one behind it."],
      "font": "plex",
      "font_size": 9
    },
    {
      "type": "text",
      "rect": {"llx": 60, "lly": 508, "urx": 535, "ury": 526},
      "content": ["✓ Paid · ★ Priority · ☂ Weather hold · ✗ Refused"],
      "font": "chained",
      "font_size": 15
    },

    {
      "type": "text",
      "rect": {"llx": 60, "lly": 442, "urx": 535, "ury": 470},
      "content": ["The line above is cut into 7 stretches, drawn by two fonts: IBMPlexSans, then DejaVuSans. The words are in the first; the marks it lacks are in the second."],
      "font": "chained",
      "font_size": 10,
      "leading": 14
    },

    {
      "type": "text",
      "rect": {"llx": 60, "lly": 389.2, "urx": 535, "ury": 400},
      "content": ["Mark"],
      "font": "plex",
      "font_size": 9
    },
    {
      "type": "text",
      "rect": {"llx": 106, "lly": 389.2, "urx": 581, "ury": 400},
      "content": ["Status"],
      "font": "plex",
      "font_size": 9
    },
    {
      "type": "text",
      "rect": {"llx": 236, "lly": 389.2, "urx": 711, "ury": 400},
      "content": ["Drawn by"],
      "font": "plex",
      "font_size": 9
    },

    {
      "type": "text",
      "rect": {"llx": 60, "lly": 358, "urx": 535, "ury": 382},
      "content": ["✓"],
      "font": "chained",
      "font_size": 10
    },
    {
      "type": "text",
      "rect": {"llx": 106, "lly": 358, "urx": 581, "ury": 382},
      "content": ["Paid"],
      "font": "chained",
      "font_size": 10
    },
    {
      "type": "text",
      "rect": {"llx": 236, "lly": 358, "urx": 711, "ury": 382},
      "content": ["IBMPlexSans"],
      "font": "chained",
      "font_size": 10
    },

    {
      "type": "text",
      "rect": {"llx": 60, "lly": 340, "urx": 535, "ury": 364},
      "content": ["★"],
      "font": "chained",
      "font_size": 10
    },
    {
      "type": "text",
      "rect": {"llx": 106, "lly": 340, "urx": 581, "ury": 364},
      "content": ["Priority"],
      "font": "chained",
      "font_size": 10
    },
    {
      "type": "text",
      "rect": {"llx": 236, "lly": 340, "urx": 711, "ury": 364},
      "content": ["DejaVuSans"],
      "font": "chained",
      "font_size": 10
    },

    {
      "type": "text",
      "rect": {"llx": 60, "lly": 322, "urx": 535, "ury": 346},
      "content": ["☂"],
      "font": "chained",
      "font_size": 10
    },
    {
      "type": "text",
      "rect": {"llx": 106, "lly": 322, "urx": 581, "ury": 346},
      "content": ["Weather hold"],
      "font": "chained",
      "font_size": 10
    },
    {
      "type": "text",
      "rect": {"llx": 236, "lly": 322, "urx": 711, "ury": 346},
      "content": ["DejaVuSans"],
      "font": "chained",
      "font_size": 10
    },

    {
      "type": "text",
      "rect": {"llx": 60, "lly": 304, "urx": 535, "ury": 328},
      "content": ["✗"],
      "font": "chained",
      "font_size": 10
    },
    {
      "type": "text",
      "rect": {"llx": 106, "lly": 304, "urx": 581, "ury": 328},
      "content": ["Refused"],
      "font": "chained",
      "font_size": 10
    },
    {
      "type": "text",
      "rect": {"llx": 236, "lly": 304, "urx": 711, "ury": 328},
      "content": ["DejaVuSans"],
      "font": "chained",
      "font_size": 10
    }
  ]
}