
Premier document
Police, contenu, page et catalogue.
Lire et voir le PDF →
Pages et texte
Ressources partagées, héritage et lignes explicites.
Lire et voir le PDF →
Dessin et transformations
Chemins, couleurs, courbes et matrices.
Lire et voir le PDF →
Signets et destinations
Un plan hiérarchique et des destinations nommées.
Lire et voir le PDF →
Liens cliquables
Annotations internes et actions URI.
Lire et voir le PDF →
Images
Un motif RGB en XObject et en image inline.
Lire et voir le PDF →
Dégradé et fonction
Une fonction de type 2 alimente un shading axial.
Lire et voir le PDF →
Objets compressés
Filtres, flux d’objets et références croisées.
Lire et voir le PDF →
Police TrueType et Unicode
Programme incorporé, CID, métriques et correspondance Unicode.
Lire et voir le PDF →
Images JPEG et PNG
Fichiers image, couleurs, échantillons et transparence.
Lire et voir le PDF →
Révisions incrémentales
Octets conservés, remplacements explicites et chaînage des xref.
Lire et voir le PDF →
Lire les pages d’un PDF externe
Arbre vérifié, attributs hérités et flux décodés explicitement.
Lire et voir le PDF →
Extensions Adobe et numérotation Bates
Déclaration des extensions, artefacts et numéros documentaires.
Lire et voir le PDF →
Champs et apparences AcroForm
Arbres de champs, widgets, valeurs et apparences.
Lire et voir le PDF →
Structure logique et contenu balisé
Ordre de lecture, MCID, ParentTree et liens vers les annotations.
Lire et voir le PDF →
Linéarisation
Ordre physique des objets, dépendances et indices binaires.
Lire et voir le PDF →
Couleurs, motifs et dégradés
Espaces couleur, cellules répétées et sept types de shading.
Lire et voir le PDF →
CMaps et Unicode
Encodage composé, CID, UseCMap et extraction Unicode.
Lire et voir le PDF →
Filtres et prédicteurs
LZW et prédiction TIFF/PNG des lignes avant compression.
Lire et voir le PDF →
Signatures PDF
Réservation Contents, ByteRange et signature CMS explicite.
Lire et voir le PDF →
Images, transparence et calques
Profondeurs, masques, groupes, ExtGState et contenu optionnel.
Lire et voir le PDF →
Fontes natives et écriture verticale
Type3, fontes simples, programmes PDF et métriques verticales.
Lire et voir le PDF →
Navigation, articles et présentation
Labels, cadrages, anneaux de lecture et séquences.
Lire et voir le PDF →
Fichiers incorporés et collections
Octets, métadonnées, EF/RF/CI et présentation de collection.
Lire et voir le PDF →
Suppression et générations
Liste libre, réutilisation et identités historiques.
Lire et voir le PDF →
Politique du champ signé
Seeds, verrou, apparence et preuve du résultat effectivement signé.
Lire et voir le PDF →Ces tutoriels expliquent comment un fichier PDF relie ses valeurs, dictionnaires, ressources et instructions de dessin. Chaque leçon accompagne un script complet, commenté et exécutable. Les exemples utilisent les versions publiées du core et des modules sélectionnées dans le manifeste de sources. La construction vérifie leurs commits exacts et leur accord avec le composer.lock du checkout source du core.
Les leçons 09 et 10 utilisent les modules optionnels pdftoolkit/pdf-fonts et
pdftoolkit/pdf-images, installés comme dépendances de développement dans le
checkout du core. Leurs objets PDF restent dans le core. Le guide des packages
explique comment installer seulement les mécanismes nécessaires à une application
et présente le lecteur externe pdftoolkit/pdf-reader, utilisé par la leçon 12.
Le parcours s'inspire de l'organisation des tutoriels FPDF et de sa collection de scripts. Ici, les objets du format restent visibles : une police est une ressource, une page appartient à un arbre et une ligne de texte est une séquence d'opérateurs.
Installer les bibliothèques dans une application
Le core et les modules sont disponibles sur Packagist. Depuis votre projet :
composer require "roukmoute/pdf:^0.5.5"
Les leçons 09, 10 et 12 utilisent respectivement pdftoolkit/pdf-fonts,
pdftoolkit/pdf-images et pdftoolkit/pdf-reader. Le
guide des packages
donne leurs commandes d'installation. L'application charge son propre
vendor/autoload.php et assemble les objets présentés dans les leçons.
Préparer le dépôt
Il faut PHP 8.3 ou supérieur et les extensions ctype, iconv et zlib. Les commandes des leçons s'exécutent depuis la racine d'un checkout du core PDFToolkit/pdf. Les fichiers Markdown et la construction du site appartiennent à PDFToolkit/pdftoolkit.github.io ; voir les instructions de construction pour préparer les sources aux versions documentées. Depuis le checkout du core :
export COMPOSER_ROOT_VERSION=0.5.x-dev
composer install
php examples/hello-world.php
Sous PowerShell, définir $env:COMPOSER_ROOT_VERSION = '0.5.x-dev' avant
composer install. Le checkout utilise son composer.lock pour installer
les outils de développement et les trois modules aux versions documentées.
Les leçons 20 et 26 demandent aussi l'extension openssl, utilisée par son backend de
signature. Le certificat et la clé de démonstration sont des fixtures publiques
de test ; le guide explique comment fournir une identité et une politique de
confiance propres à l'application.
Le script écrit examples/hello-world.pdf et affiche son chemin. Ouvrir ce fichier dans un lecteur PDF permet de comparer le résultat au code. Les scripts de génération sous examples/ acceptent un chemin de sortie comme premier argument :
php examples/hello-world.php mon-premier-document.pdf
Le dossier parent du chemin choisi doit déjà exister. Les scripts chargent vendor/autoload.php ; ils peuvent être exécutés depuis un autre dossier en donnant leur chemin complet. Les PDF générés dans examples/ sont ignorés par Git.
La leçon 12 utilise un script installé avec le module lecteur. Son argument désigne le PDF à lire ; le résultat est une sortie console. Son tutoriel présente le PDF d'entrée, ses trois pages et les objets lus.
Parcours
| Étape | Résultat et notions | Code complet |
|---|---|---|
| 01. Premier document | Une phrase, une police, une page, un catalogue et un titre documentaire. | hello-world.php |
| 02. Pages et texte | Plusieurs pages, ressources partagées, héritage, positions et interligne. | pages-and-text.php |
| 03. Dessin et transformations | Couleurs, chemins, courbes, état graphique et matrices. | graphics.php |
| 04. Signets et destinations | Un plan hiérarchique et des destinations vers les pages. | navigation.php |
| 05. Liens cliquables | Annotations avec destination interne et action URI. | links.php |
| 06. Images | Le même motif en image XObject et en image incorporée au contenu. | images.php |
| 07. Dégradé et fonction | Une fonction de type 2 alimente un shading axial. | gradient.php |
| 08. Objets compressés | Filtres, flux d'objets et flux de références croisées. | object-stream.php |
| 09. Police TrueType et Unicode | Programme incorporé, CID, largeurs et correspondance ToUnicode. | embedded-font.php |
| 10. Images JPEG et PNG | Inspection JPEG, décodage PNG, échantillons et transparence. | image-files.php |
| 11. Révisions incrémentales | Conservation des octets, remplacements et chaînage des xref. | incremental-update.php |
| 12. Lire un PDF externe | Arbre vérifié, valeurs héritées et flux de contenu inspectés puis décodés. | pages.php du module lecteur |
| 13. Extensions Adobe et numérotation Bates | Déclaration des extensions, propriétés d'artefact et pied de page Bates. | adobe-extensions.php |
| 14. Champs AcroForm | Arbre, valeurs, widgets et apparences. | acroform-fields.php |
| 15. Structure logique | Contenu marqué, ParentTree, IDTree et annotations. | tagged-structure.php |
| 16. Linéarisation | Dépendances, ordre physique et indices binaires. | linearized.php |
| 17. Couleurs et motifs | Espaces, cellules répétées et sept dégradés. | colours-patterns.php |
| 18. CMaps | UseCMap, CID et correspondances Unicode. | cmap-font.php |
| 19. Filtres et prédicteurs | Compression LZW, prédiction TIFF et PNG. | filters-predictors.php |
| 20. Signatures | ByteRange, réservation et CMS détaché. | signed-document.php |
| 21. Images, transparence et calques | Échantillons, masques, groupes et visibilité. | native-graphics.php |
| 22. Fontes natives | Type3, fontes simples et métriques verticales. | native-fonts.php |
| 23. Navigation native | Labels, articles, cadrages et présentation. | native-navigation.php |
| 24. Fichiers incorporés | EF, RF, métadonnées et collections. | embedded-files.php |
| 25. Générations des objets | Suppression, liste libre et réutilisation. | object-lifecycle.php |
| 26. Politique de signature | Champ, seeds, verrou et résultat effectivement signé. | signature-field-policy.php |
Les leçons 03 à 07 peuvent se lire dans l'ordre des sujets qui vous intéressent, après le premier document. Les leçons 08 et 11 concernent l'organisation du fichier ; les leçons 09 et 10 ajoutent des programmes de police et des fichiers image réels au graphe. La leçon 12 consulte les structures d'un PDF existant avec les objets du lecteur.
Les leçons 14 et 15 construisent les relations des formulaires et du contenu balisé. Les leçons 16 et 20 montrent deux écritures spécialisées : organiser les octets pour la linéarisation et réserver les plages d'une signature. Les leçons 17 à 19, 21 et 22 approfondissent les couleurs, maillages, CMaps, filtres, images, transparence et fontes natives. Chaque objet PDF et ses ressources restent assemblés explicitement dans le script.
Quelques repères avant de lire le code
| Objet ou terme | Rôle |
|---|---|
NameType('F1') |
Le nom PDF /F1. Dans une ressource de police, c'est une clé locale choisie par l'auteur. |
NumericType(72) |
Un nombre PDF. Dans l'espace utilisateur par défaut, 72 unités correspondent à un pouce. |
LiteralString |
Des octets destinés à une chaîne PDF. Pour Tj, la police et son encodage déterminent les glyphes. |
TextString |
Une chaîne documentaire, avec encodage Unicode explicite lorsque nécessaire, utilisée par exemple pour un titre ou un signet. |
Entry |
Une clé NameType et une valeur PDF dans un dictionnaire. Les entrées spécialisées expriment des contraintes supplémentaires. |
IndirectReference |
Une référence vers une instance d'objet. Le writer détermine son identifiant dans le fichier. |
ContentStreams |
La suite des opérateurs qui décrivent le dessin ou le texte d'une page. |
StreamObject |
Un flux d'octets avec son dictionnaire et ses éventuels filtres. Sa longueur est calculée à l'écriture. |
ResourceDictionary |
Les ressources nommées que les opérateurs peuvent utiliser : polices, images, shadings, etc. |
PageTreeNode / DocumentCatalog |
L'arbre des pages et le point d'entrée du document. |
Une page neuve utilise normalement une origine en bas à gauche et un axe vertical orienté vers le haut. Une matrice ou une rotation de page peut changer la relation entre ces coordonnées et le résultat affiché. Les exemples montrent leurs coordonnées explicitement.
with() construit une nouvelle valeur : il faut conserver son retour. Les arbres de pages et de signets s'assemblent avec addKid() et addItem(), qui rattachent un enfant à un seul parent. Cette différence de responsabilité est détaillée dans l'architecture.
Recettes et contributions
La collection de recettes commence par un tableau combinant texte, rectangles et traits. Elle montre comment construire une présentation concrète avec les objets déjà étudiés. Les positions sont calculées dans le script ; le cœur de la bibliothèque reste le modèle PDF.
Pour proposer un exemple de génération, ajouter un script autonome dans examples/ du core, puis son guide et une entrée dans cet index dans le dépôt de documentation. Publier la version du package et mettre à jour le manifeste de sources avant de documenter ses nouveaux exemples. Un exemple de lecture conserve son script et ses fixtures dans le dépôt du module ; la construction du site déclare leur provenance. Le guide doit expliquer le résultat attendu, les objets employés, les paramètres à modifier et les limites. Un exemple communautaire peut créditer son auteur et citer ses sources. Les exemples présentés ici appartiennent au projet ; cette liste pourra accueillir les contributions au fil des pull requests.
La CI exécute tous les scripts examples/*.php, puis contrôle chaque PDF avec qpdf. En local, avec qpdf installé :
qpdf --check examples/hello-world.pdf
qpdf --qdf --object-streams=disable examples/hello-world.pdf document-lisible.pdf
La seconde commande réécrit le PDF dans une forme utile pour examiner ses objets. Un contrôle syntaxique doit être complété par l'ouverture du document : un PDF valide peut encore avoir un texte hors de la page ou une mauvaise mise en page.
Aller vers la norme
Les guides citent les sections de PDF 1.7 / ISO 32000-1:2008 et du supplément Adobe. La couverture distingue les définitions, constructions et règles effectivement vérifiées. Les signatures font partie du parcours ; les objets de chiffrement disposent de leur propre documentation. La création de sous-ensembles de programmes de fonte, la composition de scripts complexes, le retour automatique à la ligne et l'import avec remappage d'un PDF externe restent à construire. Les aperçus démontrent le rendu des exemples ; ils ne certifient pas la conformité complète d'un document, son accessibilité ou la confiance d'un certificat.