Vlastnost THotPDF.DecodeBudgetBytes
Nastavuje maximální agregovaný počet bajtů přijatých ze všech dekódovacích fází v jednom řetězci filtrů proudu PDF
Deklarace
// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
out AInfo: THPDFDecodeBudgetInfo): Boolean;
// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
THPDFDecodeBudgetInfo &AInfo);
Výchozí
268435456 bajtů, tj. 256 MiB
Agregované účtování
Každý generický filtr zapisuje přes ohraničený proud dříve, než data dosáhnou svého zálohovacího paměťového proudu
- Řetězec jako
[/ASCII85Decode /FlateDecode]spotřebovává výstup ASCII85 plus výstup Flate ze sdíleného rozpočtu - Podporované generické filtry zahrnují
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeaRunLengthDecode, včetně jejich PDF zkrácených zápisů - Výstup obrazového prediktoru sdílí stejný rozpočt jako předcházející generické obrazové filtry
- Původní zakódovaný vstup se neúčtuje, protože rozpočet měří expanzi vytvořenou dekódováním
- Každý nezávislý řetězec proudu začíná čerstvým rozpočtem pro daný řetězec, zatímco
DocumentDecodeBudgetBytesdodává samostatný strop na úrovni dokumentu
Diagnostika
GetLastDecodeBudgetInfo vrací nejnovější limit řetězce, přijaté dekódované bajty, největší fázi, počet filtrů, stav limitu a filtr, který limit překročil
THPDFDecodeBudgetInfo = record
LimitBytes: Int64;
DecodedBytes: Int64;
PeakStageBytes: Int64;
FilterCount: Integer;
Exceeded: Boolean;
ExceededFilter: AnsiString;
end;
Metoda vrací False, dokud instance dokumentu nedekóduje alespoň jeden filtr
Chování při selhání
Dekódování nízké úrovně vyvolá EHPDFDecodeBudgetError, když fáze překročí agregovaný rozpočet; metody čtení vyšší úrovně, které již hlásí selhání přes False nebo nil, zachovávají tento kontrakt, zatímco GetLastDecodeBudgetInfo zpřístupňuje důvod
Nastavte DecodeBudgetBytes na nulu pouze pro důvěryhodné vstupy vyžadující neomezenou expanzi pro každý řetězec; záporné hodnoty vyvolají ERangeError
Pří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);
Pří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);
}