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

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);
}

API associées