Lastnost THotPDF.DecodeBudgetBytes
Nastavi največje skupno število bajtov, sprejetih iz vseh stopenj dekodiranja v eni verigi filtrov toka PDF
Deklaracije
// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
out AInfo: THPDFDecodeBudgetInfo): Boolean;
// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
THPDFDecodeBudgetInfo &AInfo);
Privzeto
268435456 bajtov ali 256 MiB
Skupna kontabilnost
Vsak generični filter zapisuje skozi omejen tok, preden podatki dosežejo svoj podporni pomnilniški tok
- Veriga, kot je
[/ASCII85Decode /FlateDecode], porabi izhod ASCII85 plus izhod Flate iz enega skupnega proračuna - Podprti generični filtri vključujejo
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeinRunLengthDecode, vključno z njihovimi okrajšavami PDF - Izhod napovednika slik si deli isti proračun kot predhodni generični slikovni filtri
- Izvirni kodirani vhod se ne zaračuna, ker proračun meri razširitev, ki jo proizvede dekodiranje
- Vsaka neodvisna veriga tokov začne s svežim proračunom na verigo,
DocumentDecodeBudgetBytespa zagotavlja ločeni strop na ravni dokumenta
Diagnostike
GetLastDecodeBudgetInfo vrne najnovejšo omejitev verige, sprejete dekodirane bajte, največjo stopnjo, število filtrov, status omejitve in filter, ki je presegel omejitev
THPDFDecodeBudgetInfo = record
LimitBytes: Int64;
DecodedBytes: Int64;
PeakStageBytes: Int64;
FilterCount: Integer;
Exceeded: Boolean;
ExceededFilter: AnsiString;
end;
Metoda vrne False, dokler instanca dokumenta ni dekodirala vsaj enega filtra
Vedenje ob napaki
Nizkoravensko dekodiranje sproži EHPDFDecodeBudgetError, ko stopnja preseže skupni proračun; visokoravenske metode branja, ki o neuspehu že poročajo prek False ali nil, ohranijo to pogodbo, GetLastDecodeBudgetInfo pa izpostavi razlog
Nastavite DecodeBudgetBytes na ničlo le za zaupanja vredne vnose, ki zahtevajo neomejeno razširitev na verigo; negativne vrednosti sprožijo ERangeError
Primer v Delphiju
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);
Primer v C++Builderju
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);
}