Renderização progressiva e cancelamento

O HotPDF consegue renderizar uma página carregada ao longo de várias chamadas limitadas e consegue parar operações de documento de longa duração através de um token de cancelamento partilhado, da propriedade de quem chama

Renderização progressiva de páginas

Para fontes de rede linearizadas, THPDFLinearizedPageRedrawScheduler separa os intervalos de primeira pintura das dependências opcionais de objetos partilhados e pede um redraw só depois de uma dependência recém-chegada poder alterar a 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 aceita um tempo máximo decorrido em milissegundos, um número máximo de operadores de conteúdo de página de topo, ou ambos; zero significa ilimitado para esse orçamento

A chamada completa pelo menos um operador antes de aplicar um orçamento de tempo não nulo, pelo que o estado gráfico fica sempre em pausa num limite de operador

Bitmap expõe o bitmap parcial vivo, só de leitura para quem chama, enquanto TakeBitmap transfere a propriedade sem copiar depois de a sessão atingir prsCompleted ou prsCancelled

ObjectsProcessed e TotalObjects informam operadores de conteúdo de topo de todas as streams /Contents da página pela ordem da origem

Renderização progressiva por região

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;

As quatro coordenadas da região são pontos do espaço do utilizador PDF com origem no canto inferior esquerdo, e o bitmap de saída cobre exatamente essa janela no DPI pedido

A sessão reutiliza a display list em cache, retém o estado gráfico e de texto entre chamadas e suprime pinturas caras de paths, texto, imagens, Forms e shadings cujos limites conservadores não interseccionam a ROI

Os operadores de estado e o avanço de texto continuam a executar-se pela ordem da origem, pelo que descartar uma marca anterior não pode mover nem recolorir uma marca visível posterior

RegionVisiblePaintObjects e RegionCulledPaintObjects expõem a seleção da display list, enquanto a reserva de memória de pico segue as dimensões da região em vez da página completa

Scans JPEG progressivos

Quando THotPDF.ProgressiveJPEGScanDecoding é verdadeiro, uma imagem DCTDecode progressiva elegível avança um scan JPEG por chamada limitada de ContinueRender, para que o bitmap vivo possa mostrar uma pré-visualização grosseira antes do scan final

THotPDF.ProgressiveJPEGMaxScans limita cada imagem a entre 1 e 4096 scans, enquanto o orçamento de bytes de descodificação do documento também cobre o bitmap de saída alinhado

THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded e THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded informam as contagens de scans e de imagens concluídos; THPDFLoadedPageRenderSession.OnProgressiveJPEGScan recebe um THPDFProgressiveJPEGScanEvent após cada scan visível e pode cancelar a sessão

A unidade HPDFJpeg também expõe THPDFJpegScanDecoder para entradas brutas THPDFJpegByteArray, com resultados THPDFJpegScanDecodeStatus e um callback opcional THPDFJpegCancellationCheck para cancelamento ao nível da linha

O caminho incremental aceita pinturas de imagens JPEG DeviceRGB ou DeviceGray para o alvo completo, com opacidade predefinida e sem máscaras, funções de transferência, halftones, overprint ou estado de grupo de transparência; todas as outras pinturas usam o descodificador de imagem completa para preservar a semântica de renderização

Desativar a opção, exigir isolamento do codec, exceder um limite ou encontrar entrada malformada também seleciona o caminho de imagem completa, sem expor uma descodificação parcial falhada

Callbacks de progresso

THPDFProgressiveRenderProgressEvent corre depois de cada operador concluído e recebe as contagens processadas e totais, mais o tempo decorrido de execução da renderização

Defina o parâmetro Cancel do callback como true para terminar essa sessão em prsCancelled sem cancelar o token partilhado

Um Form XObject, um padrão, uma descodificação de imagem ou outra operação aninhada pertence ao operador de topo que a contém e pode exceder um orçamento de tempo pequeno antes de o controlo regressar

Cancelamento ao nível da operação

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, de utilização única e da propriedade de quem chama; Cancel pede cancelamento permanentemente e IsCancellationRequested expõe o estado

ThrowIfCancellationRequested gera EHPDFOperationCancelled e preserva o nome da operação em OperationName

THotPDF.OperationCancellationToken aplica-se ao carregamento, à renderização síncrona, à renderização progressiva sem token explícito, a OptimizeLoadedStreams, a CreatePreflightReport e a ValidatePDFVT

SignPDFWithPFX e SignPDFWithSystemCertificate disponibilizam overloads que aceitam um token diretamente

Propriedade e regras de resultados parciais

Limites de construção do renderer

A construção do renderer de páginas observa um token já cancelado antes de instalar o respetivo contexto de cor ou alocar estado gráfico, e volta a verificar em torno do trabalho de inicialização

Um construtor recusado no limite inicial preserva o contexto ativo de resolver de cores de quem chama; cancelar após a aquisição da display list liberta a display list emprestada e não publica bitmap parcial nenhum

A construção e a renderização comum continuam disponíveis após uma tentativa cancelada, com um token novo ou ausente

APIs relacionadas