THotPDF.DecodeBudgetBytes Property

Postavlja maksimalan agregatni broj bajtova koje prihvataju sve faze dekodiranja u jednom lancu filtera PDF toka

Deklaracije

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

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

Podrazumevano

268435456 bajtova, odnosno 256 MiB

Agregatno računovodstvo

Svaki generički filter piše kroz ograničeni tok pre nego što podaci stignu do svog pozadinskog toka u memoriji

Dijagnostika

GetLastDecodeBudgetInfo vraća najnovije ograničenje lanca, prihvaćene dekodovane bajtove, najveću fazu, broj filtera, status ograničenja i filter koji je premašio ograničenje

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

Metod vraća False sve dok instanca dokumenta ne dekodira najmanje jedan filter

Ponašanje pri neuspehu

Dekodiranje na niskom nivou izbacuje EHPDFDecodeBudgetError kada faza premaši agregatni budžet; metode čitanja na visokom nivou koje već prijavljuju neuspeh kroz False ili nil čuvaju taj ugovor dok GetLastDecodeBudgetInfo izlaže razlog

Postavite DecodeBudgetBytes na nulu samo za poverljive ulaze koji zahtevaju neograničeno širenje po-lancu; negativne vrednosti izbacuju ERangeError

Delphi primer

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

C++Builder primer

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

Povezani API-ji