Прогресивно рендиране и отмяна

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 приема максимално изминало време в милисекунди, максимум оператори от съдържанието на най-горно ниво на страницата, или и двете; нула означава без ограничение за съответния бюджет

Извикването завършва поне един оператор, преди да приложи ненулев времеви бюджет, така че graphics state винаги паузира на граница между оператори

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

Сесията преизползва кеширания display list, пази graphics и text състоянието между извикванията и подтиска скъпите рисувания на пътеки, текст, изображения, Form и shadings, чиито консервативни граници не пресичат ROI-я

Операторите за състояние и текстовото напредване пак се изпълняват в изходния ред, така че изрязването на по-ранна марка не може да премести или пребояди по-късна видима марка

RegionVisiblePaintObjects и RegionCulledPaintObjects излагат селекцията от display list, а резервацията на пикова памет следва размерите на областта вместо цялата страница

Прогресивни JPEG сканирания

Когато THotPDF.ProgressiveJPEGScanDecoding е true, годно прогресивно DCTDecode изображение напредва с по един JPEG scan на ограничено извикване на ContinueRender, така че живият битмап да покаже груб ранен преглед преди финалния scan

THotPDF.ProgressiveJPEGMaxScans ограничава всяко изображение между 1 и 4096 сканирания, а бюджетът на документа за декодирани байтове покрива и подравнения изходен битмап

THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded и THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded докладват завършени scan-ове и изображения; THPDFLoadedPageRenderSession.OnProgressiveJPEGScan получава THPDFProgressiveJPEGScanEvent след всеки видим scan и може да отмени сесията

Unit-ът HPDFJpeg излага и THPDFJpegScanDecoder за сурови входове THPDFJpegByteArray с резултати THPDFJpegScanDecodeStatus и опционален callback THPDFJpegCancellationCheck за отмяна на ниво ред

Incremental пътят приема изображения-бои DeviceRGB или DeviceGray за цялата цел с прозрачност по подразбиране и без маски, transfer функции, halftone, overprint или състояние на transparency group; всички останали бои минават през декодера за пълно изображение, за да се запазят семантиките на рендиране

Изключена опция, изисквана codec изолация, надхвърлен лимит или повреден вход също избират пътя за пълно изображение, без да излагат частично провалено декодиране

Callback-и за прогрес

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 е thread-safe, еднократен и собственост на извикващия; Cancel трайно иска отмяна, а IsCancellationRequested излага състоянието

ThrowIfCancellationRequested хвърля EHPDFOperationCancelled и запазва името на операцията в OperationName

THotPDF.OperationCancellationToken важи за зареждане, синхронно рендиране, прогресивно рендиране без изричен токен, OptimizeLoadedStreams, CreatePreflightReport и ValidatePDFVT

SignPDFWithPFX и SignPDFWithSystemCertificate предлагат overload-и, които приемат токен директно

Собственост и правила за частични резултати

Свързани API