THotPDF.DecodeBudgetBytes-egenskab
Angiver det maksimale samlede antal bytes, der accepteres fra alle afkodningsfaser i én PDF-strøm-filterkæde
Deklarationer
// 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 regnskab
Hvert generisk filter skriver gennem en afgrænset strøm, inden data når sin backende hukommelsesstrøm
- En kæde som
[/ASCII85Decode /FlateDecode]forbruger ASCII85-outputtet plus Flate-outputtet fra ét delt budget - Understøttede generiske filtre omfatter
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeogRunLengthDecode, herunder deres PDF-forkortelser - Billed-prediktor-output deler det samme budget som de forudgående generiske billedfiltre
- Det oprindelige kodede input belaster ikke, fordi budgettet måler udvidelse produceret ved afkodning
- Hver uafhængig strømkæde starter med et frisk pr.-kæde-budget, mens
DocumentDecodeBudgetBytesleverer det separate dokumentbrede loft
Diagnostik
GetLastDecodeBudgetInfo returnerer den seneste kædegrænse, accepterede afkodede bytes, største fase, filtertælling, grænse-status og det filter, der overskred grænsen
THPDFDecodeBudgetInfo = record
LimitBytes: Int64;
DecodedBytes: Int64;
PeakStageBytes: Int64;
FilterCount: Integer;
Exceeded: Boolean;
ExceededFilter: AnsiString;
end;
Metoden returnerer False, indtil mindst ét filter er blevet afkodet af dokumentinstansen
Fejladfærd
Lavniveau-afkodning rejser EHPDFDecodeBudgetError, når en fase overskrider det samlede budget; højniveau-læsemetoder, der allerede rapporterer fejl via False eller nil, bevarer den kontrakt, mens GetLastDecodeBudgetInfo eksponerer årsagen
Angiv kun DecodeBudgetBytes til nul for betroede input, der kræver ubegrænset pr.-kæde-udvidelse; negative værdier rejser 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);
}