THotPDF.DecodeBudgetBytes-egenskab

Angiver det maksimale samlede antal bytes, der accepteres fra alle afkodningsfaser i én PDF-strøm-filterkæde

Deklarationer

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

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

Standard

268435456 bytes, eller 256 MiB

Samlet regnskab

Hvert generisk filter skriver gennem en afgrænset strøm, inden data når sin backende hukommelsesstrøm

Diagnostik

GetLastDecodeBudgetInfo returnerer den seneste kædegrænse, accepterede afkodede bytes, største fase, filtertælling, grænse-status og det filter, der overskred grænsen

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

Metoden returnerer False, indtil mindst ét filter er blevet afkodet af dokumentinstansen

Fejladfærd

Lavniveau-afkodning rejser EHPDFDecodeBudgetError, når en fase overskrider det samlede budget; højniveau-læsemetoder, der allerede rapporterer fejl via False eller nil, bevarer den kontrakt, mens GetLastDecodeBudgetInfo eksponerer årsagen

Angiv kun DecodeBudgetBytes til nul for betroede input, der kræver ubegrænset pr.-kæde-udvidelse; negative værdier rejser ERangeError

Delphi-eksempel

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

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

Relaterede API'er