Renderizado progresivo y cancelación
HotPDF puede renderizar una página cargada en varias llamadas acotadas y puede detener operaciones de documento de larga duración mediante un token de cancelación compartido propiedad del llamador
Renderizado progresivo de páginas
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 página de nivel superior, 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, por lo que el estado de gráficos siempre se pausa en un límite de operador
Bitmap expone el mapa de bits parcial en vivo de solo lectura para el llamador, mientras que TakeBitmap transfiere la propiedad sin copiar después de que la sesión alcance prsCompleted o prsCancelled
ObjectsProcessed y TotalObjects informan de los operadores de contenido de nivel superior de cada flujo /Contents de página en orden de origen
Renderizado progresivo de regiones
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 región son puntos de espacio de usuario PDF con un origen inferior izquierdo y el mapa de bits de salida cubre exactamente esa ventana al DPI solicitado
La sesión reutiliza la lista de visualización en caché, conserva el estado de gráficos y texto entre llamadas y suprime los pintados costosos de rutas, texto, imágenes, Form y sombreados cuyos límites conservadores no se cruzan con la ROI
Los operadores de estado y el avance de texto aún se ejecutan en orden de origen, por lo que descartar una marca anterior no puede mover ni recolorear una marca visible posterior
RegionVisiblePaintObjects y RegionCulledPaintObjects exponen la selección de la lista de visualización, mientras que la reserva de memoria máxima sigue las dimensiones de la región en lugar de la página completa
Escaneos JPEG progresivos
Cuando THotPDF.ProgressiveJPEGScanDecoding es true, una imagen DCTDecode progresiva elegible avanza un escaneo JPEG por cada llamada ContinueRender acotada para que el mapa de bits en vivo pueda mostrar una vista previa gruesa temprana antes del escaneo final
THotPDF.ProgressiveJPEGMaxScans limita cada imagen a entre 1 y 4096 escaneos, mientras que el presupuesto de bytes de decodificación del documento también cubre el mapa de bits de salida alineado
THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded y THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded informan de los recuentos de escaneos e imágenes completados; THPDFLoadedPageRenderSession.OnProgressiveJPEGScan recibe un THPDFProgressiveJPEGScanEvent después de cada escaneo visible y puede cancelar la sesión
La unidad HPDFJpeg también expone THPDFJpegScanDecoder para entradas THPDFJpegByteArray brutas, con resultados THPDFJpegScanDecodeStatus y una devolución de llamada THPDFJpegCancellationCheck opcional para la cancelación a nivel de fila
La ruta incremental acepta pintados de imagen JPEG DeviceRGB o DeviceGray de destino completo con opacidad predeterminada y sin máscaras, funciones de transferencia, semitonos, sobreimpresión ni estado de grupo de transparencia; todos los demás pintados usan el decodificador de imagen completa para conservar la semántica de renderizado
Deshabilitar la opción, requerir aislamiento de códec, superar un límite o encontrar una entrada malformada también selecciona la ruta de imagen completa sin exponer una decodificación parcial fallida
Devoluciones de llamada de progreso
THPDFProgressiveRenderProgressEvent se ejecuta después de cada operador completado y recibe los recuentos procesados y totales más el tiempo de ejecución de renderizado transcurrido
Establezca el parámetro Cancel de la devolución de llamada en true para finalizar esa sesión en prsCancelled sin cancelar el token compartido
Un Form XObject, un patrón, una decodificación de imagen u otra operación anidada pertenece a su operador de nivel superior contenedor y puede exceder un pequeño presupuesto de tiempo antes de que el control regrese
Cancelación en toda la 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 seguro para subprocesos, 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 se aplica a la carga, el renderizado síncrono, el renderizado progresivo sin token explícito, OptimizeLoadedStreams, CreatePreflightReport y ValidatePDFVT
SignPDFWithPFX y SignPDFWithSystemCertificate proporcionan sobrecargas que aceptan un token directamente
Reglas de propiedad y resultados parciales
- El documento y el token deben sobrevivir a cada
THPDFLoadedPageRenderSessionque los referencie - Una carga cancelada puede ir seguida de una carga nueva en la misma instancia de documento
- La optimización de flujos es cooperativa en lugar de transaccional, por lo que los flujos completados antes de la cancelación permanecen optimizados
- Un destino de firma cancelado puede contener salida parcial y debe descartarse cuando se requiere entrega atómica
- Una llamada al proveedor de clave privada de Windows no puede interrumpirse de forma segura, por lo que la cancelación se observa inmediatamente antes y después de esa llamada