Властивість THotPDF.DecodeBudgetBytes

Установлює максимальну сукупну кількість байтів, прийнятих від усіх стадій декодування в одному ланцюзі фільтрів потоку PDF

Оголошення

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

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

Стандарт

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

Приклад 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);

Приклад 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