Свойство THotPDF.DecodeBudgetBytes
Задава максималния сумарен брой байтове, приемани от всички етапи на декодиране в една PDF поточна филтърна верига
Декларация
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
__property __int64 DecodeBudgetBytes;
Стойност по подразбиране
268435456 байта, или 256 MiB
Описание
Всеки общ филтър пише през ограничен поток, преди данните да достигнат своя поддържащ поток в паметта
- Верига като
[/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
Свързани 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);
}