THotPDF.DecodeBudgetBytes Özelliği

Bir PDF akış süzgeç zincirindeki tüm kod çözme aşamalarından kabul edilen en yüksek toplam bayt sayısını ayarlar

Bildirimler

// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
  out AInfo: THPDFDecodeBudgetInfo): Boolean;

// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
  THPDFDecodeBudgetInfo &AInfo);

Varsayılan

268435456 bayt veya 256 MiB

Toplam muhasebe

Her genel süzgeç, veri kendi bellek akışına ulaşmadan önce sınırlı bir akış üzerinden yazar

Tanılamalar

GetLastDecodeBudgetInfo, en son zincir sınırını, kabul edilen kod çözülen baytları, en büyük aşamayı, süzgeç sayısını, sınır durumunu ve sınırı aşan süzgeci döndürür

THPDFDecodeBudgetInfo = record
  LimitBytes: Int64;
  DecodedBytes: Int64;
  PeakStageBytes: Int64;
  FilterCount: Integer;
  Exceeded: Boolean;
  ExceededFilter: AnsiString;
end;

Yöntem, belge örneği tarafından en az bir süzgeç kod çözülene kadar False döndürür

Başarısızlık davranışı

Düşük düzey kod çözme, bir aşama toplam bütçeyi aştığında EHPDFDecodeBudgetError yükseltir; False veya nil üzerinden başarısızlığı zaten raporlayan yüksek düzey okuma yöntemleri o sözleşmeyi korurken GetLastDecodeBudgetInfo nedeni ortaya koyar

DecodeBudgetBytes'ı yalnızca zincir başına sınırsız genişleme gerektiren güvenilir girdiler için sıfıra ayarlayın; negatif değerler ERangeError yükseltir

Delphi örneği

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 örneği

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

İlgili API'ler