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 МиБ
Совокупный учёт
Каждый универсальный фильтр пишет через ограниченный поток перед тем, как данные достигают своего резидентного в памяти потока
- Такая цепочка, как
[/ASCII85Decode /FlateDecode], расходует вывод ASCII85 плюс вывод Flate из одного общего бюджета - Поддерживаемые универсальные фильтры включают
FlateDecode,LZWDecode,ASCIIHexDecode,ASCII85DecodeиRunLengthDecode, включая их сокращения PDF - Вывод предиктора изображений разделяет тот же бюджет с предшествующими универсальными фильтрами изображений
- Исходный кодированный вход не тарифицируется, поскольку бюджет измеряет расширение, производимое декодированием
- Каждая независимая цепочка потоков начинается со свежего бюджета для цепочки, тогда как
DocumentDecodeBudgetBytesзадаёт отдельный потолок для всего документа
Диагностика
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);
}