Properti THotPDF.DecodeBudgetBytes
Mengatur jumlah byte agregat maksimum yang diterima dari semua tahap dekode dalam satu rantai filter stream PDF
Deklarasi
// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
out AInfo: THPDFDecodeBudgetInfo): Boolean;
// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
THPDFDecodeBudgetInfo &AInfo);
Default
268435456 byte, atau 256 MiB
Akuntansi agregat
Setiap filter generik menulis melalui stream berbatas sebelum data mencapai stream memori pendukungnya
- Rantai seperti
[/ASCII85Decode /FlateDecode]mengonsumsi keluaran ASCII85 ditambah keluaran Flate dari satu anggaran bersama - Filter generik yang didukung mencakup
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85Decode, danRunLengthDecode, termasuk singkatannya dalam PDF - Keluaran prediktor citra berbagi anggaran yang sama dengan filter citra generik sebelumnya
- Masukan terkode asli tidak ditagih karena anggaran mengukur ekspansi yang dihasilkan oleh dekode
- Setiap rantai stream independen dimulai dengan anggaran per-rantai yang baru sementara
DocumentDecodeBudgetBytesmenyediakan batas tingkat-dokumen terpisah
Diagnostik
GetLastDecodeBudgetInfo mengembalikan batas rantai terbaru, byte terdekode yang diterima, tahap terbesar, jumlah filter, status batas, dan filter yang melebihi batas
THPDFDecodeBudgetInfo = record
LimitBytes: Int64;
DecodedBytes: Int64;
PeakStageBytes: Int64;
FilterCount: Integer;
Exceeded: Boolean;
ExceededFilter: AnsiString;
end;
Metode mengembalikan False sampai setidaknya satu filter didekode oleh instans dokumen
Perilaku kegagalan
Dekode tingkat-rendah memunculkan EHPDFDecodeBudgetError ketika sebuah tahap melebihi anggaran agregat; metode baca tingkat-tinggi yang sudah melaporkan kegagalan melalui False atau nil mempertahankan kontrak itu sementara GetLastDecodeBudgetInfo mengekspos alasannya
Set DecodeBudgetBytes ke nol hanya untuk masukan tepercaya yang memerlukan ekspansi per-rantai tanpa batas; nilai negatif memunculkan ERangeError
Contoh 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);
Contoh 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);
}