Поступальний рендеринг і скасування
HotPDF може відрендерити завантажену сторінку за кілька обмежених викликів і може зупинити тривалі операції з документом через спільний токен скасування, що належить викликальнику
Поступальний рендеринг сторінок
Для лінеаризованих мережевих джерел THPDFLinearizedPageRedrawScheduler відділяє діапазони першого друку від необов'язкових залежностей спільних об'єктів і запитує повторний рендеринг лише тоді, коли щойно прибула залежність може змінити сторінку
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 і затінь, чиї консервативні межі не перетинають ROI
Оператори стану та поступ тексту все одно виконуються в порядку джерела, тому вилучення ранішого маркера не може перемістити або перефарбувати пізніший видимий маркер
RegionVisiblePaintObjects і RegionCulledPaintObjects розкривають вибір списку відтворення, тоді як резервування пікової пам'яті слідує за розмірами області, а не за повною сторінкою
Поступальні скани JPEG
Коли THotPDF.ProgressiveJPEGScanDecoding задане як true, відповідне поступове зображення DCTDecode просувається на один скан JPEG за кожний обмежений виклик ContinueRender, тому живий бітмап може показати ранню грубу прев'ю до фінального скану
THotPDF.ProgressiveJPEGMaxScans обмежує кожне зображення від 1 до 4096 скан-ків, тоді як бюджет декодувальних байтів документа також покриває вирівняний вихідний бітмап
THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded і THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded звітують про завершені кількості скан-ків і зображень; THPDFLoadedPageRenderSession.OnProgressiveJPEGScan отримує THPDFProgressiveJPEGScanEvent після кожного видимого скану і може скасувати сесію
Модуль HPDFJpeg також надає THPDFJpegScanDecoder для необроблених входів THPDFJpegByteArray із результатами THPDFJpegScanDecodeStatus та необов'язковим зворотним викликом THPDFJpegCancellationCheck для скасування на рівні рядків
Інкрементальний шлях приймає друки повноцільових зображень DeviceRGB або DeviceGray із непрозорістю за замовчуванням і без масок, трансфер-функцій, растрових структур, overprint або стану групи прозорості; усі інші друки використовують декодер повного зображення, щоб зберегти семантику рендерингу
Вимкнення опції, вимога ізоляції кодеку, перевищення ліміту або пошкоджений вхід також обирають шлях повного зображення, не розкриваючи часткове невдале декодування
Зворотні виклики прогресу
THPDFProgressiveRenderProgressEvent виконується після кожного завершеного оператора та отримує оброблену та загальну кількість плюс час виконання рендерингу
Установіть параметр Cancel зворотного виклику як 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 неможливо безпечно перервати, тому скасування спостерігається безпосередньо перед і після цього виклику