THotPDF.DecodeBudgetBytes-Eigenschaft

Legt die maximale aggregierte Anzahl von Bytes fest, die von allen Dekodierungsstufen in einer PDF-Stream-Filterkette akzeptiert werden

Deklarationen

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

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

Standardwert

268435456 Bytes oder 256 MiB

Aggregierte Buchhaltung

Jeder generische Filter schreibt durch einen begrenzten Stream, bevor Daten ihren zugrunde liegenden Speicherstream erreichen

Diagnostik

GetLastDecodeBudgetInfo gibt das letzte Kettenlimit, die akzeptierten dekodierten Bytes, die größte Stufe, die Filteranzahl, den Limit-Status und den Filter zurück, der das Limit überschritten hat

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

Die Methode gibt False zurück, bis mindestens ein Filter durch die Dokumentinstanz dekodiert wurde

Fehlverhalten

Die Low-Level-Dekodierung löst EHPDFDecodeBudgetError aus, wenn eine Stufe das aggregierte Budget überschreitet; High-Level-Lesemethoden, die bereits Fehler über False oder nil melden, bewahren diesen Vertrag, während GetLastDecodeBudgetInfo den Grund offenlegt

Setzen Sie DecodeBudgetBytes nur für vertrauenswürdige Eingaben auf null, die unbegrenzte pro-Ketten-Expansion erfordern; negative Werte lösen ERangeError aus

Delphi-Beispiel

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

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

Verwandte APIs