type TPdfStreamInspector = class ... end;
| Constructor | Description |
|---|---|
Create(Source: TStream) | Lit une source PDF positionnable avec les budgets par défaut et restaure sa position d’origine |
Create(Source: TStream; const Options: TPdfStreamInspectOptions) | Lit une source PDF positionnable avec des budgets choisis par l’appelant |
Create(const Data: TBytes) | Inspecte un tableau d’octets PDF existant avec les budgets par défaut |
Create(const Data: TBytes; const Options: TPdfStreamInspectOptions) | Inspecte un tableau d’octets PDF existant avec des budgets choisis par l’appelant |
| Method | Description |
|---|---|
CopyRawData(Index, Destination, out Report) | Copie la charge utile encodée complète d’un objet de flux |
CopyRawData(Index, Destination, Offset, Count, out Report) | Copie une fenêtre d’octets validée sans décoder la chaîne de filtres |
DecodeData(Index, Destination, Level, out Report) | Renvoie les données brutes ou applique les filtres généraux pris en charge dans l’ordre de déclaration |
PdfStreamFilterKindFromName(Name) | Mappe un nom de filtre PDF complet ou abrégé vers TPdfStreamFilterKind |
| Constant | Value | Purpose |
|---|---|---|
PdfStreamInspectDefaultSourceLimit | 512 MiB | Taille maximale de source conservée |
PdfStreamInspectDefaultRawLimit | 256 MiB | Charge utile brute maximale copiée par une opération |
PdfStreamInspectDefaultDecodedLimit | 256 MiB | Charge utile décodée maximale produite par une opération |
PdfStreamInspectDefaultExpansionRatio | 100 | Rapport maximal d’expansion décodé sur encodé |
PdfStreamInspectDefaultMaxStreams | 1,000,000 | Nombre maximal d’objets de flux inventoriés |
PdfStreamInspectDefaultDictionaryLimit | 1 MiB | Octets de dictionnaire maximaux inspectés pour un flux |
| Type | Description |
|---|---|
TPdfStreamFilterKind | Classe les filtres comme psfkUnknown, psfkASCIIHex, psfkASCII85, psfkLZW, psfkFlate, psfkRunLength, psfkCCITTFax, psfkJBIG2, psfkDCT, psfkJPX, psfkCrypt ou psfkBrotli |
TPdfStreamNativeAccess | Sélectionne l’absence de chemin natif, l’accès aux objets image ou l’accès aux fichiers embarqués |
TPdfStreamDecodeLevel | Sélectionne le décodage brut, par filtres généraux pris en charge, ou de la chaîne complète requise |
TPdfStreamReadStatus | Signale psrsCompleted, psrsPartiallyDecoded, psrsInvalidIndex, psrsInvalidRange, psrsSourceLimitExceeded, psrsRawLimitExceeded, psrsDecodedLimitExceeded, psrsExpansionRatioExceeded, psrsUnsupportedFilter, psrsUnsupportedDecodeParameters, psrsEncrypted, psrsExternalData, psrsMalformed ou psrsWriteError |
TPdfStreamFilterInfo | Nom de filtre, Kind, présence DecodeParms HasDecodeParameters, Predictor, Colors, BitsPerComponent, Columns et valeur LZW EarlyChange |
TPdfStreamFilterInfos | Tableau dynamique d’enregistrements TPdfStreamFilterInfo |
TPdfStreamInfo | Identité d’objet (ObjectNumber, Generation, TypeName), décalages et longueurs (ObjectOffset, DictionaryOffset, DictionaryLength, RawOffset, RawLength, DecodedLengthHint), indicateurs de disposition (LengthIsIndirect, UsedEndStreamFallback), indicateurs de chiffrement et de fichier externe (HasExternalFile, IsEncryptedDocument), noms de type (SubtypeName), frontière native (NativeAccess valant psnaNone, psnaImageObject ou psnaEmbeddedFile) et chaîne Filters déclarée |
TPdfStreamInfos | Tableau dynamique d’enregistrements TPdfStreamInfo |
TPdfStreamInspectOptions | Budgets choisis par l’appelant pour la source, la charge utile (MaxRawBytes, MaxDecodedBytes), l’expansion (MaxExpansionRatio), le nombre d’objets (MaxStreams), le dictionnaire (MaxDictionaryBytes), les jetons (MaxTokens), l’allocation (MaxAllocationBytes) et l’échéance DeadlineMilliseconds, avec un initialiseur statique Default |
TPdfStreamReadReport | Statut, comptes d’octets (InputByteCount, OutputByteCount), nombres de filtres appliqués et restants (AppliedFilterCount, RemainingFilterCount), index du filtre en échec (FailedFilterIndex) et texte ErrorMessage pour une lecture |
| Member | Type | Description |
|---|---|---|
Count | Integer | Nombre d’objets de flux physiques ou de révisions trouvés dans la source |
Infos[Index] | TPdfStreamInfo | Numéro d’objet, génération, décalages, longueurs, filtres, DecodeParms et classification d’accès natif |
Encrypted | Boolean | Indique si le trailer déclare le chiffrement du document |
Options | TPdfStreamInspectOptions | Budgets de ressources normalisés utilisés par l’inspecteur |
SourceByteCount | Int64 | Nombre d’octets d’entrée conservés pour l’inspection |
psdlRaw copie les octets encodés du flux sans appliquer de filtrespsdlGeneral applique les prédicteurs ASCIIHex, ASCII85, LZW, Flate, RunLength, TIFF 8 bits et PNG, puis renvoie psrsPartiallyDecoded lorsqu’un codec image ou inconnu subsistepsdlFull exige que la chaîne complète utilise les filtres généraux pris en charge et renvoie sinon psrsUnsupportedFilterpsnaImageObject dirige les appelants au niveau document vers les API natives FPDFImageObj_GetImageDataRaw, FPDFImageObj_GetImageDataDecoded et les API de filtres d’imagespsnaEmbeddedFile dirige les appelants de pièces jointes vers le chemin natif FPDFAttachment_GetFilepsrsEncrypted, car l’ABI native publique ne déchiffre pas un flux indirect arbitraire par numéro d’objetTPdfStreamInspectOptions.Default combine ses plafonds de source, de charge utile, d’expansion, de dictionnaire et de flux avec la politique courante TPdfParserResourceBudget de jetons, d’objets, d’octets décodés, de rapport d’expansion, d’allocation et d’échéance
TPdfStreamReadReport enregistre le statut, les comptes d’octets d’entrée et de sortie, les filtres appliqués et restants, l’index du filtre en échec et les erreurs d’écriture vers la destination
L’implémentation actuelle conserve une copie bornée de la source pour assurer une résolution fiable des longueurs indirectes et des lectures aléatoires répétables du flux ; utilisez un MaxSourceBytes inférieur lors du traitement de téléversements non fiables sous un budget mémoire plus serré
var
Inspector: TPdfStreamInspector;
Output: TMemoryStream;
Report: TPdfStreamReadReport;
begin
Inspector := TPdfStreamInspector.Create(PdfBytes);
Output := TMemoryStream.Create;
try
if Inspector.Count > 0 then
Inspector.DecodeData(0, Output, psdlGeneral, Report);
finally
Output.Free;
Inspector.Free;
end;
end;