THotPDF.DecodeBudgetBytes Property
Postavlja najveći ukupni broj bajtova prihvaćenih iz svih faza dekodiranja u jednom lancu filtera toka PDF-a
Deklaracije
// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
out AInfo: THPDFDecodeBudgetInfo): Boolean;
// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
THPDFDecodeBudgetInfo &AInfo);
Zadana vrijednost
268435456 bajtova, odnosno 256 MiB
Ukupno računovodstvo
Svaki generički filter zapisuje kroz ograničeni tok prije nego što podaci dosegnu svoj pozadinski memorijski tok
- Lanac poput
[/ASCII85Decode /FlateDecode]troši ASCII85 izlaz plus Flate izlaz iz jednog dijeljenog proračuna - Podržani generički filteri uključuju
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeiRunLengthDecode, uključujući njihove PDF kratice - Izlaz prediktora slike dijeli isti proračun s prethodnim generičkim filterima slike
- Izvorni kodirani ulaz se ne naplaćuje jer proračun mjeri proširenje proizvedeno dekodiranjem
- Svaki neovisni lanac toka započinje sa svježim proračunom po lancu, dok
DocumentDecodeBudgetBytesopskrbljuje zasebni strop na razini dokumenta
Dijagnostika
GetLastDecodeBudgetInfo vraća najnovije ograničenje lanca, prihvaćene dekodirane bajtove, najveću fazu, broj filtera, status ograničenja i filter koji je prešao ograničenje
THPDFDecodeBudgetInfo = record
LimitBytes: Int64;
DecodedBytes: Int64;
PeakStageBytes: Int64;
FilterCount: Integer;
Exceeded: Boolean;
ExceededFilter: AnsiString;
end;
Metoda vraća False sve dok instanca dokumenta ne dekodira barem jedan filter
Failure behaviour
Dekodiranje niske razine podiže EHPDFDecodeBudgetError kada faza premaši ukupni proračun; metode čitanja visoke razine koje već izvještavaju o neuspjehu putem False ili nil čuvaju taj ugovor, dok GetLastDecodeBudgetInfo izlaže razlog
Postavite DecodeBudgetBytes na nulu samo za pouzdane ulaze koji zahtijevaju neograničeno proširenje po lancu; negativne vrijednosti podižu ERangeError
Delphi example
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 example
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);
}