Proprietatea THotPDF.DecodeBudgetBytes
Setează numărul maxim agregat de octeți acceptați de la toate etapele de decodare într-un lanț de filtre de flux PDF
Declarații
// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
out AInfo: THPDFDecodeBudgetInfo): Boolean;
// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
THPDFDecodeBudgetInfo &AInfo);
Implicit
268435456 octeți, adică 256 MiB
Contabilitate agregată
Fiecare filtru generic scrie printr-un flux limitat înainte ca datele să ajungă la fluxul său de memorie suport
- Un lanț precum
[/ASCII85Decode /FlateDecode]consumă ieșirea ASCII85 plus ieșirea Flate dintr-un buget comun - Filtrele generice suportate includ
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeșiRunLengthDecode, inclusiv abrevierile lor PDF - Ieșirea predictorului de imagine partajează același buget cu filtrele generice de imagine precedente
- Intrarea codificată originală nu este taxată, deoarece bugetul măsoară expansiunea produsă de decodare
- Fiecare lanț de flux independent începe cu un buget proaspăt per-lanț, în timp ce
DocumentDecodeBudgetBytesfurnizează plafonul separat la nivel de document
Diagnosticare
GetLastDecodeBudgetInfo returnează limita celui mai recent lanț, octeții decodificați acceptați, cea mai mare etapă, numărul de filtre, starea limitei și filtrul care a depășit limita
THPDFDecodeBudgetInfo = record
LimitBytes: Int64;
DecodedBytes: Int64;
PeakStageBytes: Int64;
FilterCount: Integer;
Exceeded: Boolean;
ExceededFilter: AnsiString;
end;
Metoda returnează False până când cel puțin un filtru a fost decodificat de instanța documentului
Comportament la eșec
Decodarea la nivel inferior ridică EHPDFDecodeBudgetError atunci când o etapă depășește bugetul agregat; metodele de citire la nivel superior care raportează deja eșecul prin False sau nil păstrează acel contract, în timp ce GetLastDecodeBudgetInfo expune motivul
Setați DecodeBudgetBytes la zero doar pentru intrări de încredere care necesită expansiune nelimitată per-lanț; valorile negative ridică ERangeError
Exemplu Delphi
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);
Exemplu C++Builder
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);
}