שיטת THotPDF.DecodeLoadedStreamToStream
מפענחת זרם PDF טעון דרך שרשרת המסננים המלאה שלו וכותבת את השלב הסופי ישירות אל זרם בבעלות הקורא
הצהרה
function DecodeLoadedStreamToStream(AStream: THPDFStreamObject; Output: TStream; out Info: THPDFDecodePipelineInfo): boolean;
יחידה
HPDFDoc
פרמטרים
| שם | מטרה |
|---|---|
AStream | THPDFStreamObject טעון שרשומת ה-/Filter שלו מפוענחת |
Output | יעד בבעלות הקורא שמקבל בתים מפוענחים במיקום הנוכחי שלו |
Info | מקבל ספירות בתי קלט ופלט, ספירות מסננים, עומק, מצב, מסנן נכשל ואבחון |
Info | מקבל ספירות בייטים של קלט ופלט, ספירות מסננים, עומק, מצב, מסנן שנכשל ואבחון |
ערך החזרה
מחזיר True רק כאשר כל שלב מבוקש מצליח
הערות שימוש
- המסנן הסופי כותב אל
Outputמבלי ליצור זרם זיכרון סופי שני בגודל מלא - שלבי ביניים נשארים חסומים על ידי
DecodeBudgetBytesוכל בית מפוענח גם צורך אתDocumentDecodeBudgetBytes DecodeFilterLimitדוחה מערכים גדולים-מדי לפני הקצאת שלבDocumentDecodeBudgetBytes- ASCII85 דורש סימן סיום מדויק של
~>ו-ASCIIHex דורש>; צינורות טעונים פגומים נכשלים במקום לקבל נתונים קטועים -
DecodeFilterLimit DecodePipelineDepthLimit, זיהוי הפניות-עקיפות מחזוריות וזיהוי רקורסיית אותו-זרם חוסמים גרפי אובייקטים עוינים- מיקום זרם המקור משוחזר לאחר הצלחה או כשל
- יעד זרימה שנכשל יכול להכיל בתים שכבר התקבלו לפני הכשל; השתמש ביעד זמני כאשר נדרש פלט אטומי
IHPDFCustomStreamFilterחולקים את אותם תקציבים מצטברים ועומק צינור - פלט push ו-pull מותאם מבודד בזרם זמני אדפטיבי עד שהשלב המותאם מצליח
- עומס הביטול מחזיר
dpsCancelledבמקום להדליףEHPDFOperationCancelled - יעד סטרימינג שנכשל עשוי להכיל בייטים שכבר התקבלו לפני הכשל; השתמשו ביעד זמני כשנדרש פלט אטומי
אבחון
THPDFDecodePipelineInfo = record
Status: THPDFDecodePipelineStatus;
InputBytes: Int64;
OutputBytes: Int64;
FilterCount: Integer;
AppliedFilterCount: Integer;
PipelineDepth: Integer;
StopBeforeLast: Boolean;
FailedFilter: AnsiString;
Diagnostic: AnsiString;
end;
Status מבחין בין זרמים ומסננים בלתי-תקינים, גבולות ספירת-מסננים ועומק, הפניות מחזוריות, זרמים רקורסיביים, מסננים לא נתמכים, כשלי תקציב וכשלי מפענח
דוגמה
Output := TFileStream.Create('payload.bin', fmCreate);
try
if not PDF.DecodeLoadedStreamToStream(StreamObject, Output, Info) then
raise Exception.Create(String(Info.Diagnostic));
finally
Output.Free;
end;