Властивість 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
Агрегований облік
Кожен типовий фільтр пише через обмежений потік до того, як дані досягають свого резервного потоку в пам'яті
- Ланцюг, як-от
[/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);
}