Egenskapen THotPDF.DecodeBudgetBytes
Sätter det maximala sammanlagda antalet byte som accepteras från alla avkodningssteg i en PDF-strömfilterkedja
Deklarationer
// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
out AInfo: THPDFDecodeBudgetInfo): Boolean;
// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
THPDFDecodeBudgetInfo &AInfo);
Standard
268435456 byte, eller 256 MiB
Sammanlagd redovisning
Varje generiskt filter skriver genom en bunden ström innan data når sin backingminnesström
- En kedja som
[/ASCII85Decode /FlateDecode]förbrukar ASCII85-utmatningen plus Flate-utmatningen från en delad budget - Generiska filter som stöds omfattar
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeochRunLengthDecode, inklusive deras PDF-förkortningar - Bildprediktorutmatning delar samma budget som de föregående generella bildfiltren
- Den ursprungliga kodade indatan debiteras inte eftersom budgeten mäter expansion som skapats genom avkodning
- Varje oberoende strömkedja startar med en ny per-kedje-budget medan
DocumentDecodeBudgetByteslevererar det separata dokumentvida taket
Diagnostik
GetLastDecodeBudgetInfo returnerar den senaste kedjegränsen, accepterade avkodade byte, största steg, filterantal, gränsvärdesstatus och det filter som överskred gränsen
THPDFDecodeBudgetInfo = record
LimitBytes: Int64;
DecodedBytes: Int64;
PeakStageBytes: Int64;
FilterCount: Integer;
Exceeded: Boolean;
ExceededFilter: AnsiString;
end;
Metoden returnerar False tills minst ett filter har avkodats av dokumentinstansen
Felbeteende
Lågnivåavkodning kastar EHPDFDecodeBudgetError när ett steg överskrider den sammanlagda budgeten; högnivåläsmetoder som redan rapporterar misslyckande via False eller nil bevarar det avtalet medan GetLastDecodeBudgetInfo exponerar orsaken
Sätt DecodeBudgetBytes till noll endast för tillförlitliga indata som kräver obegränsad per-kedje-expansion; negativa värden kastar ERangeError
Delphi-exempel
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-exempel
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);
}