Aperçu : Premier document
Tutoriel 01

Premier document

Police, contenu, page et catalogue.

Lire et voir le PDF →
Aperçu : Pages et texte
Tutoriel 02

Pages et texte

Ressources partagées, héritage et lignes explicites.

Lire et voir le PDF →
Aperçu : Dessin et transformations
Tutoriel 03

Dessin et transformations

Chemins, couleurs, courbes et matrices.

Lire et voir le PDF →
Aperçu : Signets et destinations
Tutoriel 04

Signets et destinations

Un plan hiérarchique et des destinations nommées.

Lire et voir le PDF →
Aperçu : Liens cliquables
Tutoriel 05

Liens cliquables

Annotations internes et actions URI.

Lire et voir le PDF →
Aperçu : Images
Tutoriel 06

Images

Un motif RGB en XObject et en image inline.

Lire et voir le PDF →
Aperçu : Dégradé et fonction
Tutoriel 07

Dégradé et fonction

Une fonction de type 2 alimente un shading axial.

Lire et voir le PDF →
Aperçu : Objets compressés
Tutoriel 08

Objets compressés

Filtres, flux d’objets et références croisées.

Lire et voir le PDF →
Aperçu : Police TrueType et Unicode
Tutoriel 09

Police TrueType et Unicode

Programme incorporé, CID, métriques et correspondance Unicode.

Lire et voir le PDF →
Aperçu : Images JPEG et PNG
Tutoriel 10

Images JPEG et PNG

Fichiers image, couleurs, échantillons et transparence.

Lire et voir le PDF →
Aperçu : Révisions incrémentales
Tutoriel 11

Révisions incrémentales

Octets conservés, remplacements explicites et chaînage des xref.

Lire et voir le PDF →
Aperçu : Lire les pages d’un PDF externe
Tutoriel 12

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 →
Aperçu : Extensions Adobe et numérotation Bates
Tutoriel 13

Extensions Adobe et numérotation Bates

Déclaration des extensions, artefacts et numéros documentaires.

Lire et voir le PDF →
Aperçu : Champs et apparences AcroForm
Tutoriel 14

Champs et apparences AcroForm

Arbres de champs, widgets, valeurs et apparences.

Lire et voir le PDF →
Aperçu : Structure logique et contenu balisé
Tutoriel 15

Structure logique et contenu balisé

Ordre de lecture, MCID, ParentTree et liens vers les annotations.

Lire et voir le PDF →
Aperçu : Linéarisation
Tutoriel 16

Linéarisation

Ordre physique des objets, dépendances et indices binaires.

Lire et voir le PDF →
Aperçu : Couleurs, motifs et dégradés
Tutoriel 17

Couleurs, motifs et dégradés

Espaces couleur, cellules répétées et sept types de shading.

Lire et voir le PDF →
Aperçu : CMaps et Unicode
Tutoriel 18

CMaps et Unicode

Encodage composé, CID, UseCMap et extraction Unicode.

Lire et voir le PDF →
Aperçu : Filtres et prédicteurs
Tutoriel 19

Filtres et prédicteurs

LZW et prédiction TIFF/PNG des lignes avant compression.

Lire et voir le PDF →
Aperçu : Signatures PDF
Tutoriel 20

Signatures PDF

Réservation Contents, ByteRange et signature CMS explicite.

Lire et voir le PDF →
Aperçu : Images, transparence et calques
Tutoriel 21

Images, transparence et calques

Profondeurs, masques, groupes, ExtGState et contenu optionnel.

Lire et voir le PDF →
Aperçu : Fontes natives et écriture verticale
Tutoriel 22

Fontes natives et écriture verticale

Type3, fontes simples, programmes PDF et métriques verticales.

Lire et voir le PDF →
Aperçu : Navigation, articles et présentation
Tutoriel 23

Navigation, articles et présentation

Labels, cadrages, anneaux de lecture et séquences.

Lire et voir le PDF →
Aperçu : Fichiers incorporés et collections
Tutoriel 24

Fichiers incorporés et collections

Octets, métadonnées, EF/RF/CI et présentation de collection.

Lire et voir le PDF →
Aperçu : Suppression et générations
Tutoriel 25

Suppression et générations

Liste libre, réutilisation et identités historiques.

Lire et voir le PDF →
Aperçu : Politique du champ signé
Tutoriel 26

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.

Commencer par le premier document · Retour au README

Source de ce guide au commit documenté ↗