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
- Łańcuch taki jak
[/ASCII85Decode /FlateDecode]zużywa wyjście ASCII85 plus wyjście Flate ze wspólnego budżetu - Obsługiwane filtry ogólne obejmują
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeiRunLengthDecode, włącznie z ich skrótami PDF - Wyjście predyktora obrazu współdzieli ten sam budżet co poprzedzające filtry ogólne obrazu
- Oryginalne zakodowane wejście nie jest obciążane, ponieważ budżet mierzy ekspansję powstałą podczas dekodowania
- Każdy niezależny łańcuch strumienia rozpoczyna od świeżego budżetu na łańcuch, podczas gdy
DocumentDecodeBudgetBytesdostarcza osobny limit dla całego dokumentu
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);
}