Vlastnosť THotPDF.DecodeBudgetBytes

Nastavuje maximálny súhrnný počet bajtov akceptovaných zo všetkých fáz dekódovania v jednom reťazci filtrov streamu PDF

Deklarácie

// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
  out AInfo: THPDFDecodeBudgetInfo): Boolean;

// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
  THPDFDecodeBudgetInfo &AInfo);

Predvolené

268435456 bajtov, teda 256 MiB

Súhrnné účtovníctvo

Každý všeobecný filter zapisuje cez ohraničený stream predtým, ako dáta dosiahnu svoj zálohovací pamäťový stream

Diagnostika

GetLastDecodeBudgetInfo vracia najnovší limit reťazca, akceptované dekódované bajty, najväčšiu fázu, počet filtrov, stav limitu a filter, ktorý prekročil limit

THPDFDecodeBudgetInfo = record
  LimitBytes: Int64;
  DecodedBytes: Int64;
  PeakStageBytes: Int64;
  FilterCount: Integer;
  Exceeded: Boolean;
  ExceededFilter: AnsiString;
end;

Metóda vracia False, kým inštancia dokumentu nedekóduje aspoň jeden filter

Správanie pri zlyhaní

Nízkoúrovňové dekódovanie vyvolá EHPDFDecodeBudgetError, keď fáza prekročí súhrnný rozpočet; metódy čítania vysokej úrovne, ktoré už hlásia zlyhanie prostredníctvom False alebo nil, zachovajú tento kontrakt, zatiaľ čo GetLastDecodeBudgetInfo vystaví dôvod

Nastavte DecodeBudgetBytes na nulu len pre dôveryhodné vstupy, ktoré vyžadujú neobmedzenú expanziu na reťazec; záporné hodnoty vyvolajú ERangeError

Príklad v 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);

Príklad v 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);
}

Súvisiace API