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

APIs relacionadas