Propriété THotPDF.DecodeBudgetBytes
Définit le nombre agrégé maximal d’octets acceptés de toutes les étapes de décodage dans une chaîne de filtres de flux PDF
Déclarations
// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
out AInfo: THPDFDecodeBudgetInfo): Boolean;
// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
THPDFDecodeBudgetInfo &AInfo);
Par défaut
268435456 octets, soit 256 Mio
Comptabilité agrégée
Chaque filtre générique écrit via un flux borné avant que les données n’atteignent son flux mémoire sous-jacent
- Une chaîne telle que
[/ASCII85Decode /FlateDecode]consomme la sortie ASCII85 plus la sortie Flate à partir d’un budget partagé unique - Les filtres génériques pris en charge incluent
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeetRunLengthDecode, y compris leurs abréviations PDF - La sortie du prédicteur d’image partage le même budget que les filtres d’image génériques précédents
- L’entrée codée d’origine n’est pas imputée parce que le budget mesure l’expansion produite par le décodage
- Chaque chaîne de flux indépendante démarre avec un budget frais par chaîne tandis que
DocumentDecodeBudgetBytesfournit le plafond séparé à l’échelle du document
Diagnostics
GetLastDecodeBudgetInfo renvoie la dernière limite de chaîne, les octets décodés acceptés, l’étape la plus importante, le nombre de filtres, l’état de la limite et le filtre qui a dépassé la limite
THPDFDecodeBudgetInfo = record
LimitBytes: Int64;
DecodedBytes: Int64;
PeakStageBytes: Int64;
FilterCount: Integer;
Exceeded: Boolean;
ExceededFilter: AnsiString;
end;
La méthode renvoie False tant qu’au moins un filtre n’a pas été décodé par l’instance de document
Comportement en cas d’échec
Le décodage de bas niveau lève EHPDFDecodeBudgetError lorsqu’une étape dépasse le budget agrégé ; les méthodes de lecture de haut niveau qui signalent déjà un échec via False ou nil préservent ce contrat tandis que GetLastDecodeBudgetInfo expose la raison
Définissez DecodeBudgetBytes à zéro uniquement pour des entrées de confiance exigeant une expansion illimitée par chaîne ; les valeurs négatives lèvent ERangeError
Exemple Delphi
PDF.DecodeBudgetBytes := 64 * 1024 * 1024;
if not PDF.ExtractEmbeddedFileBytes('payload.bin', Bytes) then
if PDF.GetLastDecodeBudgetInfo(Info) and Info.Exceeded then
Writeln('Decode limit reached in ', Info.ExceededFilter);
Exemple C++Builder
pdf->DecodeBudgetBytes = 64LL * 1024 * 1024;
if (!pdf->ExtractEmbeddedFileBytes("payload.bin", bytes)) {
THPDFDecodeBudgetInfo info;
if (pdf->GetLastDecodeBudgetInfo(info) && info.Exceeded)
ShowMessage("Decode limit reached in " + info.ExceededFilter);
}