THotPDF.DecodeBudgetBytes Property

Ustawia maksymalną zagregowaną liczbę bajtów akceptowanych ze wszystkich etapów dekodowania w jednym łańcuchu filtrów strumienia PDF

Deklaracje

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

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

Wartość domyślna

268435456 bytes, or 256 MiB

Aggregate accounting

Każdy filtr ogólny zapisuje przez ograniczony strumień, zanim dane trafią do swojego zapasowego strumienia w pamięci

Diagnostyka

GetLastDecodeBudgetInfo zwraca najnowszy limit łańcucha, zaakceptowane zdekodowane bajty, największy etap, liczbę filtrów, stan limitu i filtr, który przekroczył limit

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

Metoda zwraca False, dopóki co najmniej jeden filtr nie zostanie zdekodowany przez instancję dokumentu

Zachowanie w przypadku błędu

Niskopoziomowe dekodowanie zgłasza EHPDFDecodeBudgetError, gdy etap przekracza zagregowany budżet; wysokopoziomowe metody odczytu, które już zgłaszają niepowodzenie przez False lub nil, zachowują ten kontrakt, a GetLastDecodeBudgetInfo udostępnia przyczynę

Ustaw DecodeBudgetBytes na zero tylko dla zaufanych danych wejściowych wymagających nieograniczonej ekspansji na łańcuch; wartości ujemne zgłaszają ERangeError

Przykład 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);

Przykład 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);
}

Powiązane API