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