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

Powiązane API