THotPDF.DecodeBudgetBytes-egenskap
Setter det maksimale samlede antall bytes akseptert fra alle dekodingssteg i én PDF-strømfilterkjede
Deklarasjoner
// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
out AInfo: THPDFDecodeBudgetInfo): Boolean;
// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
THPDFDecodeBudgetInfo &AInfo);
Standard
268435456 bytes, eller 256 MiB
Samlet regnskap
Hvert generisk filter skriver gjennom en avgrenset strøm før data når sin støttende minnestrøm
- En kjede som
[/ASCII85Decode /FlateDecode]forbruker ASCII85-utdataen pluss Flate-utdataen fra ett delt budsjett - Støttede generiske filtre inkluderer
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeogRunLengthDecode, inkludert deres PDF-forkortelser - Bilde-prediktor-utdata deler samme budsjett som de foregående generiske bildefiltrene
- Den opprinnelige kodede inngangen belastes ikke fordi budsjettet måler ekspansjon produsert av dekoding
- Hver uavhengig strømkjede starter med et ferskt per-kjede-budsjett mens
DocumentDecodeBudgetBytesleverer den separate dokumentvide taket
Diagnostikk
GetLastDecodeBudgetInfo returnerer den nyeste kjedegrensen, aksepterte dekodede bytes, største steg, filtertelling, grensestatus og filteret som overskred grensen
THPDFDecodeBudgetInfo = record
LimitBytes: Int64;
DecodedBytes: Int64;
PeakStageBytes: Int64;
FilterCount: Integer;
Exceeded: Boolean;
ExceededFilter: AnsiString;
end;
Metoden returnerer False til minst ett filter er dekodet av dokumentinstansen
Feiladferd
Lavnivå-dekoding opphever EHPDFDecodeBudgetError når et steg overskrider det samlede budsjettet; høynivå-lesemetoder som allerede rapporterer feil gjennom False eller nil bevarer den kontrakten mens GetLastDecodeBudgetInfo eksponerer årsaken
Sett DecodeBudgetBytes til null kun for betrodde innganger som krever ubegrenset per-kjede-ekspansjon; negative verdier opphever ERangeError
Delphi-eksempel
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-eksempel
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);
}