Поступальний рендеринг і скасування

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 надають перевантаження, які приймають токен безпосередньо

Правила володіння та часткових результатів

Пов'язані API