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
[/ASCII85Decode /FlateDecode]gibi bir zincir, ASCII85 çıktısı ile Flate çıktısını tek bir paylaşılan bütçeden tüketir- Desteklenen genel süzgeçler
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeveRunLengthDecode'dur; PDF kısaltmaları dahil - Görüntü tahminci çıktısı, öncesındaki genel görüntü süzgeçleriyle aynı bütçeyi paylaşır
- Özgün kodlanmış girdi tahsil edilmez çünkü bütçe kod çözmeyle üretilen genişlemeyi ölçer
- Her bağımsız akış zinciri taze bir zincir başına bütçeyle başlarken
DocumentDecodeBudgetBytesayrı belge geneli üst sınırı sağlar
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);
}