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

APIs relacionadas