THotPDF.DecodeBudgetBytes Property
Postavlja maksimalan agregatni broj bajtova koje prihvataju sve faze dekodiranja u jednom lancu filtera PDF toka
Deklaracije
// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
out AInfo: THPDFDecodeBudgetInfo): Boolean;
// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
THPDFDecodeBudgetInfo &AInfo);
Podrazumevano
268435456 bajtova, odnosno 256 MiB
Agregatno računovodstvo
Svaki generički filter piše kroz ograničeni tok pre nego što podaci stignu do svog pozadinskog toka u memoriji
- Lanac kao što je
[/ASCII85Decode /FlateDecode]troši ASCII85 izlaz plus Flate izlaz iz jednog zajedničkog budžeta - Podržani generički filteri uključuju
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeiRunLengthDecode, uključujući njihove PDF skraćenice - Izlaz slikovnog prediktora deli isti budžet sa prethodnim generičkim slikovnim filterima
- Originalni kodirani ulaz se ne naplaćuje jer budžet meri širenje koje proizvodi dekodiranje
- Svaki nezavisni lanac toka počinje sa svežim budžetom po-lancu, dok
DocumentDecodeBudgetBytessnabdeva zasebni plafon na nivou dokumenta
Dijagnostika
GetLastDecodeBudgetInfo vraća najnovije ograničenje lanca, prihvaćene dekodovane bajtove, najveću fazu, broj filtera, status ograničenja i filter koji je premašio ograničenje
THPDFDecodeBudgetInfo = record
LimitBytes: Int64;
DecodedBytes: Int64;
PeakStageBytes: Int64;
FilterCount: Integer;
Exceeded: Boolean;
ExceededFilter: AnsiString;
end;
Metod vraća False sve dok instanca dokumenta ne dekodira najmanje jedan filter
Ponašanje pri neuspehu
Dekodiranje na niskom nivou izbacuje EHPDFDecodeBudgetError kada faza premaši agregatni budžet; metode čitanja na visokom nivou koje već prijavljuju neuspeh kroz False ili nil čuvaju taj ugovor dok GetLastDecodeBudgetInfo izlaže razlog
Postavite DecodeBudgetBytes na nulu samo za poverljive ulaze koji zahtevaju neograničeno širenje po-lancu; negativne vrednosti izbacuju ERangeError
Delphi primer
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 primer
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);
}