THotPDF.DecodeBudgetBytes Property

Задаёт максимальное совокупное число байт, принимаемых от всех стадий декодирования в одной цепочке фильтров потока PDF

Объявления

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

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

По умолчанию

268435456 байт, то есть 256 МиБ

Совокупный учёт

Каждый универсальный фильтр пишет через ограниченный поток перед тем, как данные достигают своего резидентного в памяти потока

Диагностика

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