Egenskapen THotPDF.DecodeBudgetBytes

Sätter det maximala sammanlagda antalet byte som accepteras från alla avkodningssteg i en PDF-strömfilterkedja

Deklarationer

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

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

Standard

268435456 byte, eller 256 MiB

Sammanlagd redovisning

Varje generiskt filter skriver genom en bunden ström innan data når sin backingminnesström

Diagnostik

GetLastDecodeBudgetInfo returnerar den senaste kedjegränsen, accepterade avkodade byte, största steg, filterantal, gränsvärdesstatus och det filter som överskred gränsen

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

Metoden returnerar False tills minst ett filter har avkodats av dokumentinstansen

Felbeteende

Lågnivåavkodning kastar EHPDFDecodeBudgetError när ett steg överskrider den sammanlagda budgeten; högnivåläsmetoder som redan rapporterar misslyckande via False eller nil bevarar det avtalet medan GetLastDecodeBudgetInfo exponerar orsaken

Sätt DecodeBudgetBytes till noll endast för tillförlitliga indata som kräver obegränsad per-kedje-expansion; negativa värden kastar ERangeError

Delphi-exempel

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-exempel

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

Relaterade API:er