Progresivno renderovanje i otkazivanje
HotPDF može da renderuje učitanu stranicu kroz više ograničenih poziva i može da zaustavi dugotrajne operacije nad dokumentom putem zajedničkog tokena otkazivanja u vlasništvu pozivaoca
Progresivno renderovanje stranice
Za linearizovane mrežne izvore, THPDFLinearizedPageRedrawScheduler razdvaja opsege prvog iscrtavanja od opcionih zavisnosti deljenih objekata i zahteva ponovno iscrtavanje tek nakon što novo stigla zavisnost može da promeni stranicu
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 prihvata maksimalno proteklo vreme u milisekundama, maksimalan broj operatora sadržaja stranice najvišeg nivoa ili oboje; nula znači neograničeno za taj budžet
Poziv dovršava bar jedan operator pre primene budžeta vremena različitog od nule, tako da je stanje grafike uvek pauzirano na granici operatora
Bitmap izlaže živi delimični bitmap samo za čitanje od strane pozivaoca, dok TakeBitmap prenosi vlasništvo bez kopiranja nakon što sesija dostigne prsCompleted ili prsCancelled
ObjectsProcessed i TotalObjects prijavljuju operatore sadržaja najvišeg nivoa iz svakog /Contents toka stranice po redosledu izvora
Progresivno renderovanje regiona
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;
Četiri koordinate regiona su tačke u PDF korisničkom prostoru sa poreklom u donjem levom uglu, a izlazni bitmap pokriva tačno taj prozor na traženoj DPI vrednosti
Sesija ponovo koristi keširanu listu prikaza, zadržava stanje grafike i teksta između poziva i potiskuje skupe ispune putanja, teksta, slika, Form objekata i senčenja čije konzervativne granice ne presecaju ROI
Operatori stanja i napredovanje teksta se i dalje izvršavaju po redosledu izvora, tako da odbacivanje ranije oznake ne može da pomeri ili promeni boju kasnije vidljive oznake
RegionVisiblePaintObjects i RegionCulledPaintObjects izlažu izbor liste prikaza, dok rezervacija vršne memorije prati dimenzije regiona umesto cele stranice
Progresivni JPEG skenovi
Kada je THotPDF.ProgressiveJPEGScanDecoding tačno, podobna progresivna DCTDecode slika napreduje za jedan JPEG sken po ograničenom ContinueRender pozivu tako da živi bitmap može da prikaže rani grubi pregled pre finalnog skena
THotPDF.ProgressiveJPEGMaxScans ograničava svaku sliku na između 1 i 4096 skenova, dok budžet bajtova dekodiranja dokumenta takođe pokriva poravnati izlazni bitmap
THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded i THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded prijavljuju brojeve dovršenih skenova i slika; THPDFLoadedPageRenderSession.OnProgressiveJPEGScan prima THPDFProgressiveJPEGScanEvent nakon svakog vidljivog skena i može da otkaže sesiju
Jedinica HPDFJpeg takođe izlaže THPDFJpegScanDecoder za sirove THPDFJpegByteArray ulaze, sa THPDFJpegScanDecodeStatus rezultatima i opcionim THPDFJpegCancellationCheck povratnim pozivom za otkazivanje na nivou reda
Inkrementalna putanja prihvata ispune JPEG slika DeviceRGB ili DeviceGray sa punim ciljem, podrazumevanom neprozirnošću i bez maski, funkcija prenosa, polutonova, preštampavanja ili stanja grupe transparentnosti; svi drugi ispuni koriste dekoder cele slike da bi sačuvali semantiku renderovanja
Onemogućavanje opcije, zahtevanje izolacije kodeka, prekoračenje ograničenja ili susretanje sa neispravno oblikovanim ulazom takođe bira putanju cele slike bez izlaganja delimično neuspešnog dekodiranja
Povratni pozivi napretka
THPDFProgressiveRenderProgressEvent se pokreće nakon svakog dovršenog operatora i prima brojeve obrađenih i ukupnih stavki plus proteklo vreme izvršavanja renderovanja
Postavite parametar Cancel povratnog poziva na tačno da biste završili tu sesiju u prsCancelled bez otkazivanja zajedničkog tokena
Form XObject, šablon, dekodiranje slike ili druga ugnežđena operacija pripada svom obuhvatajućem operatoru najvišeg nivoa i može da prekorači mali vremenski budžet pre nego što se kontrola vrati
Otkazivanje na nivou operacije
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 je bezbedan za niti, jednokratan i u vlasništvu pozivaoca; Cancel trajno zahteva otkazivanje, a IsCancellationRequested izlaže stanje
ThrowIfCancellationRequested podiže EHPDFOperationCancelled i čuva ime operacije u OperationName
THotPDF.OperationCancellationToken se primenjuje na učitavanje, sinhrono renderovanje, progresivno renderovanje bez eksplicitnog tokena, OptimizeLoadedStreams, CreatePreflightReport i ValidatePDFVT
SignPDFWithPFX i SignPDFWithSystemCertificate pružaju preopterećenja koja prihvataju token direktno
Pravila vlasništva i delimičnih rezultata
- Dokument i token moraju da nadžive svaku
THPDFLoadedPageRenderSessionkoja se na njih poziva - Nakon otkazanog učitavanja može da usledi novo učitavanje na istoj instanci dokumenta
- Optimizacija tokova je kooperativna, a ne transakciona, tako da tokovi dovršeni pre otkazivanja ostaju optimizovani
- Otkazano odredište potpisivanja može da sadrži delimičan izlaz i treba ga odbaciti kada je potrebna atomska isporuka
- Poziv Windows provajdera privatnog ključa ne može se bezbedno prekinuti, tako da se otkazivanje proverava neposredno pre i posle tog poziva