מאפיין 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

חשבונאות מצטברת

כל מסנן גנרי כותב דרך זרם חסום לפני שנתונים מגיעים לזרם הזיכרון הגיבוי שלו

אבחון

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

APIs קשורים