Прогресивно рендиране и отмяна
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-и, които приемат токен директно
Собственост и правила за частични резултати
- Документът и токенът трябва да надживеят всяка
THPDFLoadedPageRenderSession, която се отнася до тях - Отменено зареждане може да се последва от ново зареждане върху същата инстанция на документа
- Оптимизацията на потоци е кооперативна, а не транзакционна, така че потоците, завършени преди отмяната, остават оптимизирани
- Отменена цел на подписване може да съдържа частичен изход и трябва да се изхвърли, когато се иска атомарна доставка
- Извикване към Windows доставчик на частен ключ не може безопасно да се прекъсне, така че отмяната се наблюдава непосредствено преди и след него