Progresif Rendering ve İptal
HotPDF, yüklü bir sayfayı birden çok sınırlı çağrı boyunca render edebilir ve uzun süren belge işlemlerini paylaşılan, çağıranın sahibi olduğu bir cancellation token ile durdurabilir
Progresif sayfa rendering
Linearized ağ kaynakları için THPDFLinearizedPageRedrawScheduler, ilk boyama aralıklarını opsiyonel shared-object bağımlılıklarından ayırır ve yeni varan bir bağımlılık sayfayı değiştirebilir hâle geldiğinde yeniden çizim talep eder
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, milisaniye cinsinden en fazla geçen süreyi, en fazla sayıda en üst düzey sayfa content operatörünü veya her ikisini kabul eder; sıfır, o bütçe için sınırsız demektir
Çağrı, sıfır olmayan bir zaman bütçesi uygulamadan önce en az bir operatörü tamamlar; böylece graphics state her zaman bir operatör sınırında duraklatılır
Bitmap, canlı, çağıran için salt okunur kısmi bitmap'i dışa açar; TakeBitmap ise session prsCompleted veya prsCancelled'a ulaştıktan sonra kopyalamadan mülkiyeti devreder
ObjectsProcessed ve TotalObjects, her sayfa /Contents stream'inden gelen en üst düzey content operatörlerini kaynak sırasında raporlar
Progresif bölge rendering
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;
Dört bölge koordinatı, sol alt köşe orijinli PDF user-space noktalarıdır ve çıktı bitmap'i, istenen DPI'da tam olarak o pencereyi kapsar
Session, cache'lenen display list'i yeniden kullanır, çağrılar boyunca graphics ve metin durumunu korur ve ihtiyatlı sınırları ROI ile kesişmeyen pahalı path, metin, görsel, Form ve shading boyamalarını bastırır
State operatörleri ve metin ilerlemesi hâlâ kaynak sırasında yürütülür; böylece erken bir işareti ayıklamak, sonraki görünür bir işareti taşıyamaz veya yeniden renklendiremez
RegionVisiblePaintObjects ve RegionCulledPaintObjects, display-list seçimini dışa açar; tepe bellek rezervasyonu ise tam sayfa yerine bölge boyutlarını izler
Progresif JPEG taramaları
THotPDF.ProgressiveJPEGScanDecoding true olduğunda, uygun bir progresif DCTDecode görseli, sınırlı her ContinueRender çağrısında bir JPEG scan ilerler; böylece canlı bitmap, son taramadan önce erken kaba bir önizleme gösterebilir
THotPDF.ProgressiveJPEGMaxScans, her görseli 1 ile 4096 scan arasında sınırlar; belge decode-bayt bütçesi ayrıca hizalanmış çıktı bitmap'ini de kapsar
THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded ve THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded, tamamlanan scan ve görsel sayılarını raporlar; THPDFLoadedPageRenderSession.OnProgressiveJPEGScan, her görünür taramadan sonra bir THPDFProgressiveJPEGScanEvent alır ve session'ı iptal edebilir
HPDFJpeg unit'i ayrıca ham THPDFJpegByteArray girdileri için THPDFJpegScanDecoder'ı dışa açar; THPDFJpegScanDecodeStatus sonuçları ve satır düzeyi iptal için opsiyonel bir THPDFJpegCancellationCheck callback'i ile
Artımlı yol; varsayılan opaklıkla, mask'sız, transfer fonksiyonsuz, halftonesuz, overprintsiz ve transparency-group durumundan yoksun, tam hedefli DeviceRGB veya DeviceGray JPEG görsel boyamalarını kabul eder. Diğer tüm boyamalar, rendering semantiğini korumak için tam görsel decoder'ını kullanır
Seçeneği devre dışı bırakmak, codec izolasyonu gerektirmek, bir limiti aşmak veya bozuk girdiyle karşılaşmak da kısmi başarısız decode'i ortaya çıkarmadan tam görsel yolunu seçer
Progress callback'leri
THPDFProgressiveRenderProgressEvent, tamamlanan her operatörden sonra çalışır ve işlenen ve toplam sayıları ile geçen render-yürütme süresini alır
Paylaşılan token'ı iptal etmeden o session'ı prsCancelled içinde bitirmek için callback'in Cancel parametresini true yapın
Bir Form XObject, pattern, görsel decode veya başka bir iç içe işlem, kapsayan en üst düzey operatöre aittir ve kontrol geri dönmeden önce küçük bir zaman bütçesini aşabilir
İşlem geneli iptal
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, tek kullanımlık ve çağıranın mülkiyetindedir; Cancel kalıcı olarak iptal talep eder, IsCancellationRequested durumu dışa açar
ThrowIfCancellationRequested, EHPDFOperationCancelled fırlatır ve işlem adını OperationName içinde korur
THotPDF.OperationCancellationToken; yükleme, senkron render, açık bir token olmadan progresif render, OptimizeLoadedStreams, CreatePreflightReport ve ValidatePDFVT için geçerlidir
SignPDFWithPFX ve SignPDFWithSystemCertificate, doğrudan token kabul eden overload'lar sağlar
Mülkiyet ve kısmi sonuç kuralları
- Belge ve token, onlara atıf yapan her
THPDFLoadedPageRenderSession'tan uzun yaşamalıdır - İptal edilen bir yüklemeyi, aynı belge örneğinde taze bir yükleme izleyebilir
- Stream optimizasyonu transactional değil işbirlikçidir; iptalden önce tamamlanan stream'ler optimize edilmiş kalır
- İptal edilen bir imzalama hedefi kısmi çıktı içerebilir ve atomik teslim gerektiğinde atılmalıdır
- Bir Windows private-key provider çağrısı güvenle kesilemez; bu yüzden iptal, o çağrının hemen öncesinde ve sonrasında gözlemlenir