Renderowanie progresywne i anulowanie
HotPDF potrafi renderować załadowaną stronę w wielu ograniczonych wywołaniach i zatrzymywać długotrwałe operacje dokumentowe przez współdzielony token anulowania należący do wywołującego
Progresywne renderowanie stron
Dla zlinearyzowanych źródeł sieciowych THPDFLinearizedPageRedrawScheduler oddziela zakresy pierwszego malowania od opcjonalnych zależności we współdzielonych obiektach i żąda przemalowania tylko wtedy, gdy nowo dotarła zależność może zmienić stronę
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 przyjmuje maksymalny upływający czas w milisekundach, maksymalną liczbę operatorów treści najwyższego poziomu strony albo oba; zero oznacza brak limitu dla tego budżetu
Wywołanie kończy co najmniej jeden operator, zanim zastosuje niezerowy budżet czasu, więc stan grafiki jest zawsze pauzowany na granicy operatora
Bitmap wystawia żywą częściową bitmapę tylko do odczytu dla wywołującego, a TakeBitmap przekazuje własność bez kopiowania po osiągnięciu przez sesję prsCompleted lub prsCancelled
ObjectsProcessed i TotalObjects raportują operatory treści najwyższego poziomu z każdego strumienia /Contents strony w kolejności źródłowej
Progresywne renderowanie regionu
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;
Cztery współrzędne regionu to punkty przestrzeni użytkownika PDF z początkiem w lewym dolnym rogu, a wyjściowa bitmapa pokrywa dokładnie to okno w żądanym DPI
Sesja ponownie używa pamięci podręcznej display listy, zachowuje stan grafiki i tekstu między wywołaniami oraz wycisza kosztowne malowania ścieżek, tekstu, obrazów, Form i shadingów, których konserwatywne granice nie przecinają się z ROI
Operatory stanu i postęp tekstu nadal wykonują się w kolejności źródłowej, więc odcięcie wcześniejszego śladu nie może przenieść ani przemalować późniejszego widocznego śladu
RegionVisiblePaintObjects i RegionCulledPaintObjects wystawiają wybór z display listy, a rezerwacja pamięci szczytowej podąża za wymiarami regionu zamiast za pełną stroną
Progresywne skany JPEG
Gdy THotPDF.ProgressiveJPEGScanDecoding jest true, kwalifikujący się progresywny obraz DCTDecode przesuwa się o jeden skan JPEG na ograniczone wywołanie ContinueRender, więc żywa bitmapa może pokazać wczesny zgrubny podgląd przed ostatnim skanem
THotPDF.ProgressiveJPEGMaxScans ogranicza każdy obraz do zakresu od 1 do 4096 skanów, a budżet bajtów dekodowania dokumentu obejmuje także wyrównaną bitmapę wyjściową
THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded i THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded raportują liczby ukończonych skanów i obrazów; THPDFLoadedPageRenderSession.OnProgressiveJPEGScan odbiera THPDFProgressiveJPEGScanEvent po każdym widocznym skanie i może anulować sesję
Jednostka HPDFJpeg wystawia też THPDFJpegScanDecoder dla surowych wejść THPDFJpegByteArray, z wynikami THPDFJpegScanDecodeStatus i opcjonalnym wywołaniem zwrotnym THPDFJpegCancellationCheck do anulowania na poziomie wiersza
Ścieżka przyrostowa przyjmuje malowania obrazami JPEG DeviceRGB lub DeviceGray na cały cel z domyślną nieprzezroczystością i bez masek, funkcji transferu, rastrów, overprint ani stanu grup przezroczystości; wszystkie pozostałe malowania używają dekodera całego obrazu, żeby zachować semantykę renderowania
Wyłączenie opcji, wymóg izolacji kodeków, przekroczenie limitu albo źle uformowane wejście również wybierają ścieżkę całego obrazu, bez wystawiania częściowo nieudanego dekodowania
Wywołania zwrotne postępu
THPDFProgressiveRenderProgressEvent działa po każdym ukończonym operatorze i odbiera liczniki przetworzonych i wszystkich oraz czas wykonania renderowania
Ustaw parametr Cancel wywołania zwrotnego na true, aby zakończyć tę sesję w prsCancelled bez anulowania współdzielonego tokena
Form XObject, wzór, dekodowanie obrazu lub inna zagnieżdżona operacja należy do otaczającego operatora najwyższego poziomu i może przekroczyć mały budżet czasu, zanim sterowanie wróci
Anulowanie na poziomie operacji
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 jest thread-safe, jednorazowy i należy do wywołującego; Cancel trwale żąda anulowania, a IsCancellationRequested wystawia stan
ThrowIfCancellationRequested podnosi EHPDFOperationCancelled i zachowuje nazwę operacji w OperationName
THotPDF.OperationCancellationToken dotyczy ładowania, renderowania synchronicznego, renderowania progresywnego bez jawnego tokena, OptimizeLoadedStreams, CreatePreflightReport i ValidatePDFVT
SignPDFWithPFX i SignPDFWithSystemCertificate mają przeciążenia przyjmujące token bezpośrednio
Własność i reguły wyników częściowych
- Dokument i token muszą przeżyć każdą
THPDFLoadedPageRenderSession, która się do nich odnosi - Po anulowanym ładowaniu można wykonać świeże ładowanie na tej samej instancji dokumentu
- Optymalizacja strumieni jest kooperatywna, a nie transakcyjna, więc strumienie ukończone przed anulowaniem pozostają zoptymalizowane
- Anulowana destynacja podpisywania może zawierać częściowe wyjście i powinna zostać wyrzucona, gdy wymagany jest atomowy przekaz
- Wywołania dostawcy klucza prywatnego Windows nie da się bezpiecznie przerwać, więc anulowanie jest obserwowane bezpośrednio przed i po tym wywołaniu