Свойство THotPDF.DecodeBudgetBytes

Задава максималния сумарен брой байтове, приемани от всички етапи на декодиране в една PDF поточна филтърна верига

Декларация

property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
__property __int64 DecodeBudgetBytes;

Стойност по подразбиране

268435456 байта, или 256 MiB

Описание

Всеки общ филтър пише през ограничен поток, преди данните да достигнат своя поддържащ поток в паметта

Диагностики

GetLastDecodeBudgetInfo връща най-новата граница за веригата, приетите декодирани байтове, най-големия етап, броя филтри, състоянието на границата и филтъра, който я е надвишил

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

Методът връща False, докато поне един филтър не бъде декодиран от инстанцията на документа

Поведение при провал

Декодирането на ниско ниво повдига EHPDFDecodeBudgetError, когато етап надвиши сумарния бюджет; методи за четене на високо ниво, които вече отчитат неуспех чрез False или nil, запазват този договор, докато GetLastDecodeBudgetInfo разкрива причината

Задавайте DecodeBudgetBytes на нула само за доверени входове, които изискват неограничено разширение за веригата; отрицателни стойности повдигат ERangeError

Свързани API

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

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