THotPDF.DecodeBudgetBytes savybė
Nustato didžiausią sutelktą baitų skaičių, priimtą iš visų iššifravimo stadijų vienoje PDF srauto filtro grandinėje
Deklaracijos
// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
out AInfo: THPDFDecodeBudgetInfo): Boolean;
// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
THPDFDecodeBudgetInfo &AInfo);
Numatymas
268435456 baitų, arba 256 MiB
Sutelkta apskaita
Kiekvienas bendrinis filtras rašo per ribotą srautą, kol duomenys pasiekia savo atminties srautą
- Grandinė, tokia kaip
[/ASCII85Decode /FlateDecode], sunaudoja ASCII85 išvestį ir Flate išvestį iš vieno bendro biudžeto - Palaikomi bendriniai filtrai apima
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeirRunLengthDecode, įskaitant jų PDF santrumpas - Vaizdo prediktoriaus išvestis dalijasi tuo pačiu biudžetu su prieš tai esančiais bendriniais vaizdo filtrais
- Originali užkoduota įvestis nėra imama, nes biudžetas matuoja išplėtimą, kurį sukūrė iššifravimas
- Kiekviena nepriklausoma srauto grandinė prasideda nauju grandinės biudžetu, o
DocumentDecodeBudgetBytestiekia atskirą dokumento lygio lubas
Diagnostika
GetLastDecodeBudgetInfo grąžina naujausią grandinės limitą, priimtus iššifruotus baitus, didžiausią stadiją, filtrų skaičių, limito būseną ir filtrą, viršijusį limitą
THPDFDecodeBudgetInfo = record
LimitBytes: Int64;
DecodedBytes: Int64;
PeakStageBytes: Int64;
FilterCount: Integer;
Exceeded: Boolean;
ExceededFilter: AnsiString;
end;
Metodas grąžina False, kol bent vienas filtras buvo iššifruotas dokumento egzemplioriaus
Nesėkmės elgsena
Žemo lygio iššifravimas kelia EHPDFDecodeBudgetError, kai stadija viršija sutelktą biudžetą; aukšto lygio skaitymo metodai, kurie jau praneša apie nesėkmę per False arba nil, išlaiko tą kontraktą, o GetLastDecodeBudgetInfo atskleidžia priežastį
DecodeBudgetBytes nustatykite į nulį tik patikimoms įvestims, reikalaujančioms neriboto grandinės išplėtimo; neigiamos reikšmės kelia ERangeError
Delphi pavyzdys
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 pavyzdys
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);
}