THotPDF.DecodeBudgetBytes Property
Asettaa maksimimäärän yhdistettyjä tavuja, jotka hyväksytään kaikista yhden PDF-virtasuodinketjun dekoodausvaiheista
Määrittelyt
// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
out AInfo: THPDFDecodeBudgetInfo): Boolean;
// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
THPDFDecodeBudgetInfo &AInfo);
Oletus
268435456 tavua eli 256 MiB
Yhdistetty kirjanpito
Jokainen yleissuodatin kirjoittaa rajatun virran läpi ennen kuin tiedot saavuttavat taustana toimivan muistivirran
- Ketju kuten
[/ASCII85Decode /FlateDecode]kuluttaa ASCII85-tulosteen ja Flate-tulosteen yhdestä jaetusta budjetista - Tuetut yleissuodattimet ovat
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodejaRunLengthDecode, mukaan lukien niiden PDF-lyhenteet - Kuvan ennustajatuloste jakaa saman budjetin edeltävien yleisten kuvasuodattimien kanssa
- Alkuperäistä koodattua syötettä ei laskuteta, koska budjetti mittaa dekoodauksen tuottamaa laajenemista
- Jokainen itsenäinen virtaketju alkaa tuoreella ketjukohtaisella budjetilla, kun taas
DocumentDecodeBudgetBytestarjoaa erillisen asiakirjakohtaisen ylärajan
Diagnostiikka
GetLastDecodeBudgetInfo palauttaa viimeisimmän ketjurajan, hyväksytyt dekoodatut tavut, suurimman vaiheen, suodatinmäärän, rajatilan ja suodattimen, joka ylitti rajan
THPDFDecodeBudgetInfo = record
LimitBytes: Int64;
DecodedBytes: Int64;
PeakStageBytes: Int64;
FilterCount: Integer;
Exceeded: Boolean;
ExceededFilter: AnsiString;
end;
Menetelmä palauttaa False, kunnes asiakirjaesiintymä on dekoodannut vähintään yhden suodattimen
Virhetila
Matalan tason dekoodaus nostaa poikkeuksen EHPDFDecodeBudgetError, kun vaihe ylittää yhdistetyn budjetin; korkean tason lukumenetelmät, jotka jo ilmoittavat virheestä arvoilla False tai nil, säilyttävät sopimuksensa, kun taas GetLastDecodeBudgetInfo paljastaa syyn
Aseta DecodeBudgetBytes nollaan vain luotettaville syötteille, jotka vaativat rajoittamatonta ketjukohtaista laajenemista; negatiiviset arvot nostavat poikkeuksen ERangeError
Delphi-esimerkki
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-esimerkki
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);
}