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
- Eine Kette wie
[/ASCII85Decode /FlateDecode]verbraucht die ASCII85-Ausgabe plus die Flate-Ausgabe aus einem gemeinsamen Budget - Unterstützte generische Filter umfassen
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeundRunLengthDecode, einschließlich ihrer PDF-Abkürzungen - Die Bildprädiktor-Ausgabe teilt sich dasselbe Budget wie die vorangehenden generischen Bildfilter
- Die ursprüngliche kodierte Eingabe wird nicht belastet, da das Budget die durch Dekodierung erzeugte Expansion misst
- Jede unabhängige Stream-Kette startet mit einem frischen Kettenbudget, während
DocumentDecodeBudgetBytesdie separate dokumentweite Obergrenze liefert
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);
}