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

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);
}

API terkait