Renderizado progresivo y cancelación
HotPDF puede renderizar una página cargada a lo largo de varias llamadas acotadas y detener operaciones de documento de larga duración mediante un token de cancelación compartido y propiedad del llamador
Renderizado progresivo de páginas
Para fuentes de red linealizadas, THPDFLinearizedPageRedrawScheduler separa los rangos de primera pintura de las dependencias opcionales de objetos compartidos y solicita un redibujado solo después de que una dependencia recién llegada pueda cambiar la página
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 acepta un tiempo máximo transcurrido en milisegundos, un número máximo de operadores de contenido de nivel superior de la página, o ambos; cero significa ilimitado para ese presupuesto
La llamada completa al menos un operador antes de aplicar un presupuesto de tiempo distinto de cero, así que el estado de gráficos siempre queda pausado en un límite de operador
Bitmap expone el bitmap parcial en vivo de solo lectura para el llamador, mientras que TakeBitmap transfiere la propiedad sin copiar una vez que la sesión llega a prsCompleted o prsCancelled
ObjectsProcessed y TotalObjects reportan los operadores de contenido de nivel superior de cada stream /Contents de la página, en orden de fuente
Renderizado progresivo por región
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;
Las cuatro coordenadas de la región son puntos de espacio de usuario PDF con origen en la esquina inferior izquierda, y el bitmap de salida cubre exactamente esa ventana en el DPI solicitado
La sesión reutiliza la display list cacheada, conserva el estado de gráficos y de texto entre llamadas, y suprime las pinturas costosas de paths, texto, imágenes, Form y shadings cuyos límites conservadores no intersectan la ROI
Los operadores de estado y el avance de texto se siguen ejecutando en orden de fuente, de modo que descartar una marca anterior no puede mover ni recolorear una marca visible posterior
RegionVisiblePaintObjects y RegionCulledPaintObjects exponen la selección de la display list, mientras que la reserva de memoria pico sigue las dimensiones de la región en lugar de la página completa
Scans JPEG progresivos
Cuando THotPDF.ProgressiveJPEGScanDecoding es true, una imagen DCTDecode progresiva elegible avanza un scan JPEG por cada llamada acotada a ContinueRender, de modo que el bitmap en vivo pueda mostrar una vista previa gruesa temprana antes del scan final
THotPDF.ProgressiveJPEGMaxScans limita cada imagen a entre 1 y 4096 scans, mientras que el presupuesto de bytes de decodificación del documento también cubre el bitmap de salida alineado
THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded y THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded reportan los conteos de scans e imágenes completadas; THPDFLoadedPageRenderSession.OnProgressiveJPEGScan recibe un THPDFProgressiveJPEGScanEvent después de cada scan visible y puede cancelar la sesión
La unidad HPDFJpeg también expone THPDFJpegScanDecoder para entradas crudas THPDFJpegByteArray, con resultados THPDFJpegScanDecodeStatus y un callback opcional THPDFJpegCancellationCheck para cancelación a nivel de fila
La ruta incremental acepta pinturas de imágenes JPEG DeviceRGB o DeviceGray con destino completo, opacidad por defecto y sin masks, funciones de transferencia, halftones, overprint ni estado de grupo de transparencia; todas las demás pinturas usan el decodificador de imagen completa para preservar la semántica de renderizado
Desactivar la opción, exigir aislamiento de códec, exceder un límite o encontrar una entrada malformada también selecciona la ruta de imagen completa sin exponer una decodificación parcial fallida
Callbacks de progreso
THPDFProgressiveRenderProgressEvent se ejecuta después de cada operador completado y recibe los conteos de procesados y totales más el tiempo transcurrido de ejecución del render
Asigne true al parámetro Cancel del callback para terminar esa sesión en prsCancelled sin cancelar el token compartido
Un Form XObject, un pattern, una decodificación de imagen u otra operación anidada pertenece a su operador de nivel superior que la contiene, y puede exceder un presupuesto de tiempo pequeño antes de devolver el control
Cancelación a nivel de operación
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 es thread-safe, de un solo uso y propiedad del llamador; Cancel solicita la cancelación de forma permanente y IsCancellationRequested expone el estado
ThrowIfCancellationRequested lanza EHPDFOperationCancelled y conserva el nombre de la operación en OperationName
THotPDF.OperationCancellationToken aplica a carga, renderizado síncrono, renderizado progresivo sin token explícito, OptimizeLoadedStreams, CreatePreflightReport y ValidatePDFVT
SignPDFWithPFX y SignPDFWithSystemCertificate ofrecen overloads que aceptan un token directamente
Propiedad y reglas de resultados parciales
- El documento y el token deben sobrevivir a toda
THPDFLoadedPageRenderSessionque los referencie - Una carga cancelada puede ir seguida de una carga nueva en la misma instancia del documento
- La optimización de streams es cooperativa y no transaccional, así que los streams completados antes de la cancelación quedan optimizados
- Un destino de firma cancelado puede contener salida parcial y debe descartarse cuando se requiere entrega atómica
- Una llamada a un proveedor de clave privada de Windows no puede interrumpirse de forma segura, así que la cancelación se observa inmediatamente antes y después de esa llamada