Vlastnost THotPDF.DecodeBudgetBytes

Nastavuje maximální agregovaný počet bajtů přijatých ze všech dekódovacích fází v jednom řetězci filtrů proudu PDF

Deklarace

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

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

Výchozí

268435456 bajtů, tj. 256 MiB

Agregované účtování

Každý generický filtr zapisuje přes ohraničený proud dříve, než data dosáhnou svého zálohovacího paměťového proudu

Diagnostika

GetLastDecodeBudgetInfo vrací nejnovější limit řetězce, přijaté dekódované bajty, největší fázi, počet filtrů, stav limitu a filtr, který limit překročil

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

Metoda vrací False, dokud instance dokumentu nedekóduje alespoň jeden filtr

Chování při selhání

Dekódování nízké úrovně vyvolá EHPDFDecodeBudgetError, když fáze překročí agregovaný rozpočet; metody čtení vyšší úrovně, které již hlásí selhání přes False nebo nil, zachovávají tento kontrakt, zatímco GetLastDecodeBudgetInfo zpřístupňuje důvod

Nastavte DecodeBudgetBytes na nulu pouze pro důvěryhodné vstupy vyžadující neomezenou expanzi pro každý řetězec; záporné hodnoty vyvolají ERangeError

Pří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);

Pří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);
}

Související API