مشخصهٔ 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

حساب تجمعی

هر پالایش عمومی پیش از آنکه داده به جریان حافظهٔ پشتیبان آن برسد از طریق یک جریان محدود می‌نویسد

تشخیص‌ها

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);
}

APIهای مرتبط