עיבוד פרוגרסיבי וביטול פעולה
HotPDF יכול לעבד עמוד טעון על פני מספר קריאות מוגבלות ויכול לעצור פעולות מסמך ארוכות-טווח באמצעות אסימון ביטול משותף שבבעלות הקורא
עיבוד עמוד פרוגרסיבי
Session := PDF.BeginLoadedPageProgressiveRender(0, 144);
try
repeat
Status := Session.ContinueRender(8, 128);
Preview.Assign(Session.Bitmap);
until Status in [prsCompleted, prsCancelled];
if Status = prsCompleted then
FinalBitmap := Session.TakeBitmap;
finally
Session.Free;
end;
ContinueRender מקבל זמן ביצוע מרבי במילישניות, מספר מרבי של אופרטורי תוכן עמוד ברמה העליונה, או את שניהם; אפס פירושו ללא הגבלה עבור אותו תקציב
הקריאה משלימה לפחות אופרטור אחד לפני הפעלת תקציב זמן שאינו אפס, כך שמצב הגרפיקה תמיד מושהה בגבול של אופרטור
Bitmap חושף את מפת הסיביות החלקית החיה לקריאה בלבד של הקורא, בעוד TakeBitmap מעביר בעלות ללא העתקה לאחר שהסשן מגיע ל-prsCompleted או prsCancelled
ObjectsProcessed ו-TotalObjects מדווחים על אופרטורי תוכן ברמה העליונה מכל זרם /Contents של עמוד בסדר המקור
עיבוד אזור פרוגרסיבי
Session := PDF.BeginLoadedPageProgressiveRegionRender(
0, 72, 144, 360, 432, 144);
try
repeat
Status := Session.ContinueRender(6, 96);
until Status in [prsCompleted, prsCancelled];
finally
Session.Free;
end;
ארבע קואורדינטות האזור הן נקודות במרחב המשתמש של PDF עם ראשית בפינה השמאלית-תחתונה, ומפת הסיביות של הפלט מכסה בדיוק את החלון הזה ב-DPI המבוקש
הסשן עושה שימוש חוזר ברשימת התצוגה המאוחסנת, שומר על מצב גרפיקה וטקסט בין קריאות, ומדכא צביעות יקרות של נתיב, טקסט, תמונה, Form והצללה שגבולותיהן השמרניים אינם חותכים את אזור העניין
אופרטורי מצב וקידום טקסט עדיין מתבצעים בסדר המקור, כך שדילול סימן מוקדם יותר אינו יכול להזיז או לצבוע מחדש סימן נראה מאוחר יותר
RegionVisiblePaintObjects ו-RegionCulledPaintObjects חושפים את בחירת רשימת התצוגה, בעוד שמירת שיא הזיכרון עוקבת אחר ממדי האזור במקום אחרי העמוד המלא
סריקות JPEG פרוגרסיביות
כאשר THotPDF.ProgressiveJPEGScanDecoding הוא true, תמונת DCTDecode פרוגרסיבית מתאימה מתקדמת בסריקת JPEG אחת לכל קריאת ContinueRender מוגבלת, כך שמפת הסיביות החיה יכולה להציג תצוגה מקדימה גסה מוקדמת לפני הסריקה הסופית
THotPDF.ProgressiveJPEGMaxScans מגביל כל תמונה ל-1 עד 4096 סריקות, בעוד תקציב בתי הפענוח של המסמך מכסה גם את מפת הסיביות המיושרת של הפלט
THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded ו-THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded מדווחים על ספירות הסריקות והתמונות שהושלמו; THPDFLoadedPageRenderSession.OnProgressiveJPEGScan מקבל THPDFProgressiveJPEGScanEvent לאחר כל סריקה נראית ויכול לבטל את הסשן
יחידת HPDFJpeg חושפת גם את THPDFJpegScanDecoder עבור קלטי THPDFJpegByteArray גולמיים, עם תוצאות THPDFJpegScanDecodeStatus ו-callback אופציונלי THPDFJpegCancellationCheck לביטול ברמת שורה
הנתיב המצטבר מקבל צביעות תמונת JPEG מלאות-יעד של DeviceRGB או DeviceGray עם אטימות ברירת מחדל וללא מסכות, פונקציות העברה, חצאי-גוון, הדפסת-יתר או מצב קבוצת שקיפות; כל שאר הצביעות משתמשות במפענח התמונה המלאה כדי לשמר את סמנטיקת העיבוד
כיבוי האפשרות, דרישת בידוד codec, חריגה ממגבלה או נתקלות בקלט פגום גם הם בוחרים בנתיב התמונה המלאה מבלי לחשוף פענוח חלקי שנכשל
קריאות חוזרות להתקדמות
THPDFProgressiveRenderProgressEvent רץ לאחר כל אופרטור שהושלם ומקבל ספירות מעובדות וסך הכול בתוספת זמן ביצוע העיבוד שחלף
הגדר את פרמטר ה-Cancel של ה-callback ל-true כדי לסיים את הסשן במצב prsCancelled מבלי לבטל את האסימון המשותף
Form XObject, תבנית, פענוח תמונה או פעולה מקוננת אחרת שייכים לאופרטור ברמה העליונה שמכיל אותם ועשויים לחרוג מתקציב זמן קטן לפני שהשליטה חוזרת
ביטול ברמת פעולה
Token := THPDFCancellationToken.Create;
try
PDF.OperationCancellationToken := Token;
Worker.Start;
// Call Token.Cancel from another thread when the operation should stop
finally
PDF.OperationCancellationToken := nil;
Token.Free;
end;
THPDFCancellationToken הוא בטוח לשרשורים, חד-פעמי ובבעלות הקורא; Cancel מבקש ביטול לצמיתות ו-IsCancellationRequested חושף את המצב
ThrowIfCancellationRequested מעלה EHPDFOperationCancelled ושומר את שם הפעולה ב-OperationName
THotPDF.OperationCancellationToken חל על טעינה, עיבוד סינכרוני, עיבוד פרוגרסיבי ללא אסימון מפורש, OptimizeLoadedStreams, CreatePreflightReport ו-ValidatePDFVT
SignPDFWithPFX ו-SignPDFWithSystemCertificate מספקים עומסי-יתר שמקבלים אסימון ישירות
כללי בעלות ותוצאות חלקיות
- המסמך והאסימון חייבים לשרוד כל
THPDFLoadedPageRenderSessionשמתייחס אליהם - טעינה שבוטלה יכולה להימשך בטעינה חדשה על אותו מופע מסמך
- אופטימיזציית זרמים היא שיתופית ולא טרנזקציונית, כך שזרמים שהושלמו לפני הביטול נשארים מותאמים
- יעד חתימה שבוטל עשוי להכיל פלט חלקי ויש לזרוק אותו כאשר נדרשת מסירה אטומית
- לא ניתן להפריע בבטחה לקריאה של ספק מפתח פרטי של Windows, ולכן הביטול נצפה מיד לפני ואחרי אותה קריאה