Aller au contenu

Permissions d'incorporation

phil/fonts

La licence d'une police décide si un document peut la transporter. La table OS/2 d'OpenType l'indique dans son champ fsType, que lit EmbeddingPermissions.

Usage

EmbeddingUsageBit de fsTypeCe qu'un document peut faire
Installableaucun des bits 1 à 3Incorporer la police, et laisser le lecteur l'installer pour de bon
Editablebit 3, 0x0008Incorporer la police et être modifié avec elle ; la police disparaît avec le document
PreviewAndPrintbit 2, 0x0004Incorporer la police pour afficher et imprimer le document, qui reste en lecture seule
Restrictedbit 1, 0x0002Ne pas incorporer la police sans la permission expresse de son propriétaire

allowsEmbedding() est faux pour Restricted seulement ; allowsEditing() est vrai pour Installable et Editable.

À partir de la version 3 de OS/2, une police indique au plus un de ces bits. Une police plus ancienne peut en indiquer plusieurs, et la spécification OpenType demande alors de retenir le moins restrictif : Editable l'emporte sur PreviewAndPrint, qui l'emporte sur Restricted. Une face sans table OS/2 ne déclare rien, ce qui se lit comme installable.

Sous-ensembles et bitmaps

MéthodeBit de fsTypeSignification
allowsSubsetting()bit 8, 0x0100, à zéroUn document peut n'incorporer que les glyphes qu'il utilise ; lorsque le bit est à un, il doit incorporer la police entière
bitmapOnly()bit 9, 0x0200, à unUn document ne peut incorporer que les bitmaps de la police, jamais ses contours
allowsOutlineEmbedding()L'usage permet l'incorporation et la police n'est pas limitée aux bitmaps : ce dont un écrivain PDF ou EPUB a besoin

fsType lui-même reste disponible, pour les bits réservés qu'une révision future d'OpenType pourrait définir.

$permissions = FontFile::fromFile($path)->face()->embedding;

if (!$permissions->allowsOutlineEmbedding()) {
    throw new RuntimeException('This font may not be embedded in a PDF.');
}

$subset = $permissions->allowsSubsetting();

Ces bits sont ce que dit la police. C'est la licence sous laquelle la police a été obtenue qui engage, et elle peut accorder plus ou moins : un registre de licences (voir Licences) est l'endroit où une application consigne ce qu'on lui a dit.

phil/paged-media

phil/paged-media lit les polices TrueType pour les mesurer et les incorporer dans des documents PDF. Il lit les mêmes bits de fsType pour refuser une police dont la licence interdit l'incorporation et pour incorporer en entier une police qui interdit les sous-ensembles. Les deux bibliothèques ne dépendent pas l'une de l'autre, et aucune ne copie l'autre :

  • paged-media lit les tables dont un incorporateur a besoin (contours des glyphes, métriques, correspondance des caractères vers les glyphes) et promet un écrivain PDF sans dépendance ; phil/fonts lit les tables dont un catalogue a besoin (chaque nom, la licence, les axes de variation, les conteneurs WOFF et WOFF2) et ne construit rien.
  • Ce qu'elles partagent est peu de chose : le répertoire des tables, quelques champs de OS/2, le nom PostScript.

Si elles en viennent à partager la lecture des polices, la dépendance ira de paged-media vers phil/fonts (l'écrivain de documents utilisant le lecteur de métadonnées, la couche inférieure), jamais dans l'autre sens : phil/fonts n'a aucune raison de connaître PDF. D'ici là, une application qui incorpore des polices lit ici les permissions d'une police pour les afficher, et laisse paged-media les faire respecter au moment de l'écriture.