Vlastnosť THotPDF.DecodeBudgetBytes
Nastavuje maximálny súhrnný počet bajtov akceptovaných zo všetkých fáz dekódovania v jednom reťazci filtrov streamu PDF
Deklarácie
// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
out AInfo: THPDFDecodeBudgetInfo): Boolean;
// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
THPDFDecodeBudgetInfo &AInfo);
Predvolené
268435456 bajtov, teda 256 MiB
Súhrnné účtovníctvo
Každý všeobecný filter zapisuje cez ohraničený stream predtým, ako dáta dosiahnu svoj zálohovací pamäťový stream
- Reťazec ako
[/ASCII85Decode /FlateDecode]spotrebuje výstup ASCII85 plus výstup Flate z jedného zdieľaného rozpočtu - Podporované všeobecné filtre zahŕňajú
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeaRunLengthDecodevrátane ich PDF skratiek - Výstup obrazového prediktora zdieľa rovnaký rozpočet ako predchádzajúce všeobecné obrazové filtre
- Pôvodný zakódovaný vstup sa neúčtuje, pretože rozpočet meria expanziu produkovanú dekódovaním
- Každý nezávislý reťazec streamu začína s čerstvým rozpočtom na reťazec, zatiaľ čo
DocumentDecodeBudgetBytesdodáva samostatnú hornú hranicu v rámci dokumentu
Diagnostika
GetLastDecodeBudgetInfo vracia najnovší limit reťazca, akceptované dekódované bajty, najväčšiu fázu, počet filtrov, stav limitu a filter, ktorý prekročil limit
THPDFDecodeBudgetInfo = record
LimitBytes: Int64;
DecodedBytes: Int64;
PeakStageBytes: Int64;
FilterCount: Integer;
Exceeded: Boolean;
ExceededFilter: AnsiString;
end;
Metóda vracia False, kým inštancia dokumentu nedekóduje aspoň jeden filter
Správanie pri zlyhaní
Nízkoúrovňové dekódovanie vyvolá EHPDFDecodeBudgetError, keď fáza prekročí súhrnný rozpočet; metódy čítania vysokej úrovne, ktoré už hlásia zlyhanie prostredníctvom False alebo nil, zachovajú tento kontrakt, zatiaľ čo GetLastDecodeBudgetInfo vystaví dôvod
Nastavte DecodeBudgetBytes na nulu len pre dôveryhodné vstupy, ktoré vyžadujú neobmedzenú expanziu na reťazec; záporné hodnoty vyvolajú ERangeError
Príklad v 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);
Príklad v 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);
}