Module optionnel · pdftoolkit/pdf-reader 0.1.7
English | Français
Le namespace racine est PDF\Reading. Les primitives telles que DictionaryType,
ArrayType, NameType, IntegerType, StringType et ObjectIdentifier viennent
du modèle PDF partagé.
Document et objets source
| Composant | Construction et rôle |
|---|---|
FileBytes |
new FileBytes($bytes) conserve les octets fournis explicitement. Aucun accès fichier ou réseau. |
DocumentReader |
new DocumentReader($limits) ; read(FileBytes): ReadDocument ouvre le document structurel. Les limites ont une valeur par défaut explicite. |
ReadDocument |
Porte source, header, trailer effectif, index, budgets et caches. Construction habituelle par DocumentReader. |
ObjectResolver |
Interface resolve(BasicType): BasicType. Résout une référence dans un document sans parcourir tout le graphe. |
ObjectReference |
new ObjectReference(ObjectIdentifier) ; propriété identifier. La référence porte un identifiant, sans cible ni résolveur. Sa sérialisation est refusée. |
EncodedStream |
new EncodedStream(DictionaryType, string) ; dictionary() et encodedBytes() exposent la structure et les octets d'origine. Sa sérialisation est refusée. |
Méthodes de ReadDocument
| Méthode | Résultat et comportement |
|---|---|
header(): FileHeader |
Version déclarée dans le header physique. Une éventuelle /Version du catalogue reste accessible dans son dictionnaire. |
trailer(): DictionaryType |
Trailer effectif, assemblé en donnant la priorité aux révisions récentes. Dans un document à flux xref, il contient les entrées de son dictionnaire. |
catalog(): DictionaryType |
Résout /Root ; contrôle /Type /Catalog, la référence /Pages et la version déclarée. |
object(ObjectIdentifier): BasicType |
Charge l'objet désigné ; retourne null pour un objet absent, libre, indisponible ou de génération différente. |
resolve(BasicType): BasicType |
Appelle object() pour une référence ; conserve une valeur directe inchangée. |
streamData(EncodedStream): string |
Décode le flux sous les budgets du document. Les accès suivants réutilisent le résultat. |
Ces opérations chargent le graphe de base. Les services de pages ci-dessous ajoutent un parcours demandé explicitement ; le chargement du catalogue seul ne visite pas cet arbre.
Pages, héritage et contenu
| Composant | Construction et rôle |
|---|---|
PageTreeReader |
new PageTreeReader(ReadDocument, PageTreeLimits) ; read(): ReadPageTree parcourt l'arbre complet dans l'ordre de /Kids. Contrôle les types, comptes, parents, cycles, identités répétées et plafonds. |
ReadPageTree |
Collection immuable comptable et itérable, produite après validation. Propriétés document, root et pages ; page(int $index): ReadPage commence à zéro et refuse un indice hors collection. |
ReadPage |
Vue immuable d'une feuille : propriétés document, reference, dictionary et attributes. Le dictionnaire source est conservé. |
PageAttributes |
Ressources effectives DictionaryType, MediaBox et CropBox Rectangle, rotation IntegerType. normalizedRotation(): int dérive une orientation 0/90/180/270, sans remplacer l'entier d'origine. |
PageInheritance |
Valeurs partielles d'un ancêtre, toutes facultatives. effective(): PageAttributes exige Resources/MediaBox et applique les valeurs par défaut uniquement à la feuille. |
PageAttributeReader |
Reçoit un ObjectResolver. read(DictionaryType, PageInheritance): PageInheritance résout les quatre entrées héritables et leurs types sans visiter le contenu des ressources. |
PageTreeTraversal |
État d'une opération de parcours : pile explicite, identités déjà visitées, ordre des feuilles et comptes des sous-arbres. |
PageTreeFrame |
Une branche en cours : référence, héritage, compte déclaré et enfants restant à visiter. Vérifie son compte une fois ses descendants visités. |
PageTreeLimits |
Plafonds strictement positifs : maxDepth 64, maxNodes 100 000 et maxPages 100 000 par défaut. |
PageContentsReader |
new PageContentsReader(ReadDocument, PageContentLimits) ; read(ReadPage): PageContents résout le contenu local d'une page du même document. |
PageContents |
Collection immuable comptable et itérable : propriétés page et streams, conservés dans l'ordre. Aucune concaténation ni décompression. |
PageContentLimits |
Plafond maxStreams strictement positif, 1 024 par page par défaut. |
Les quatre entrées héritables sont Resources, MediaBox, CropBox et
Rotate. Un Resources local remplace le dictionnaire hérité sans fusion.
Null est traité comme une absence. CropBox utilise MediaBox par défaut et
Rotate utilise zéro ; les autres attributs de page restent consultables dans
le dictionnaire source. Contents n'est jamais hérité. Absence, null et tableau
vide donnent une collection de contenu vide.
Les budgets de ReadDocument restent partagés pendant ces opérations.
Les plafonds d'arbre et de contenu sont propres à chaque demande de parcours
ou de lecture. Consulter le guide des pages pour un exemple expliqué.
Syntaxe et structures
| Composant | Rôle |
|---|---|
ByteCursor |
Vue bornée de bytes, construite avec un offset et une fin facultative. position(), remaining(), peek(), read(), seek(), eof() et skipWhitespaceAndComments() contrôlent son déplacement. |
SyntaxParser |
Reçoit un curseur, des limites et éventuellement un budget. read() lit une valeur PDF ; unsignedInteger(), keyword() et atKeyword() servent aux lecteurs structuraux. Ne résout pas les références. |
IndirectObjectReader |
Reçoit source, limites et budget. read($offset, $expected, $resolver) contrôle l'enveloppe d'un objet, son identifiant et l'étendue exacte d'un stream. |
CrossReferenceReader |
Reçoit source, limites, budget et décodeur. read($offset) produit une CrossReference\Section depuis une table ou un flux xref. |
ObjectStreamReader |
Reçoit limites et budget. read($stream, $decodedBytes, $resolver) analyse les membres d'un ObjStm dans leurs tranches respectives. |
DictionaryAccess |
Accès structurel typé à un dictionnaire, avec un ObjectResolver facultatif : value(), integer() et hasName(). |
Namespace PDF\Reading\CrossReference
| Composant | Rôle |
|---|---|
EntryKind |
Enum distinguant les entrées Free, Uncompressed, Compressed et Unavailable. |
Entry |
Valeur portant numéro, type et deux champs propres au type. generation() donne la génération effective ; les membres comprimés ont génération zéro. |
Section |
Valeur d'une révision : offset, trailer, offset /Prev facultatif et liste d'entrées. |
Index |
Index sparse effectif, construit avec des sections de la plus récente à la plus ancienne. entry($number) retrouve l'entrée qui prévaut. |
L'index conserve les entrées libres récentes pour empêcher qu'un ancien objet supprimé réapparaisse. Les types xref inconnus restent indisponibles et se résolvent à null.
Filtres et prédicteurs
StreamDecoder::decode(EncodedStream, ReadBudget, ?ObjectResolver): string
interprète la chaîne /Filter et ses /DecodeParms. Les noms de filtre complets
sont utilisés. Un filtre inconnu est refusé au moment du décodage, sans empêcher
la conservation de ses octets encodés.
Namespace PDF\Reading\Filters
| Composant | Rôle |
|---|---|
Decoder |
Interface decode(string, ReadBudget): string des transformations. |
FlateDecoder |
Décompression zlib progressive en petites tranches, avec contrôle des données invalides, tronquées ou suivies d'octets supplémentaires. |
AsciiHexDecoder |
Décodage ASCIIHex : blancs PDF, chiffres hexadécimaux et dernier demi-octet éventuel. |
Ascii85Decoder |
Décodage ASCII85, blocs complets ou partiels et raccourci z. |
RunLengthDecoder |
Décodage des répétitions et segments littéraux RunLength. |
PredictorParameters |
Valeur Predictor, Colors, BitsPerComponent, Columns. Prédicteurs 1, 2 ou 10–15 ; les prédicteurs actifs requièrent des composants de 8 bits. |
PredictorDecoder |
Reconstruction des lignes TIFF ou PNG après Flate. Les tags de ligne PNG désignent l'algorithme appliqué. |
DecodedBytes |
Accumulateur contrôlant la limite d'une sortie et le budget cumulé avant de retenir une tranche. |
DCTDecode, JPXDecode, CCITTFaxDecode, JBIG2Decode, LZWDecode et Crypt ne sont pas implémentés. La lecture structurelle d'un flux image peut donc réussir, tandis que sa demande de décodage est refusée.
Limites et diagnostics
| Composant | Rôle |
|---|---|
ReaderLimits |
Valeur immuable des plafonds, configurables par arguments nommés. Tous doivent être strictement positifs. |
ReadBudget |
Compteurs cumulatifs de valeurs analysées, entrées xref, octets conservés et octets décodés, propres à une lecture. |
ParseException |
Erreur de structure ou de budget ; propriété offset facultative pour la position dans les bytes. |
UnsupportedPdfFeature |
Sous-type de ParseException, distinguant un mécanisme volontairement non pris en charge. |
Exemple de configuration :
use PDF\Reading\DocumentReader;
use PDF\Reading\ReaderLimits;
$reader = new DocumentReader(new ReaderLimits(
maxFileBytes: 8 * 1024 * 1024,
maxObjects: 10_000,
maxCrossReferenceEntries: 20_000,
maxDecodedStreamBytes: 16 * 1024 * 1024,
maxTotalDecodedBytes: 32 * 1024 * 1024,
maxRetainedBytes: 16 * 1024 * 1024,
));
Les appels de bas niveau peuvent recevoir un budget fourni explicitement.
Pour conserver les mêmes plafonds sur toute une lecture, utiliser le même
ReaderLimits et le même ReadBudget dans les composants composés.