مشخصهٔ THotPDF.DecodeBudgetBytes
بیشینهٔ تعداد تجمعی بایتهای پذیرفتهشده از همهٔ مراحل رمزگشایی در یک زنجیرهٔ پالایش جریان PDF را تنظیم میکند
اعلانها
// Delphi
property DecodeBudgetBytes: Int64;
function GetLastDecodeBudgetInfo(
out AInfo: THPDFDecodeBudgetInfo): Boolean;
// C++Builder
__property __int64 DecodeBudgetBytes;
bool __fastcall GetLastDecodeBudgetInfo(
THPDFDecodeBudgetInfo &AInfo);
پیشفرض
268435456 بایت، یا ۲۵۶ 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;
تا وقتی دستکم یک فیلتر توسط نمونهٔ سند decode نشده باشد، این متد False برمیگرداند
رفتار شکست
رمزگشایی سطحپایین وقتی یک مرحله از بودجهٔ تجمعی تجاوز میکند EHPDFDecodeBudgetError را raise میکند؛ روشهای خواندن سطحبالا که از پیش شکست را از طریق False یا nil گزارش میکنند آن قرارداد را حفظ میکنند در حالی که GetLastDecodeBudgetInfo دلیل را آشکار میسازد
DecodeBudgetBytes را تنها برای ورودیهای مورد اعتماد که نیازمند بسط نامحدود بهازای-زنجیره هستند روی صفر تنظیم کنید؛ مقدارهای منفی ERangeError را raise میکنند
نمونهٔ 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);
}