Renderização progressiva e cancelamento

O HotPDF pode renderizar uma página carregada em várias chamadas limitadas e pode interromper operações de documento de longa duração por meio de um token de cancelamento compartilhado de propriedade do chamador

Renderização progressiva de 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 nível superior, ou ambos; zero significa ilimitado para aquele orçamento

A chamada conclui pelo menos um operador antes de aplicar um orçamento de tempo diferente de zero, portanto o estado gráfico é sempre pausado em um limite de operador

Bitmap expõe o bitmap parcial ao vivo somente leitura do chamador, enquanto TakeBitmap transfere a propriedade sem copiar depois que a sessão atinge prsCompleted ou prsCancelled

ObjectsProcessed e TotalObjects relatam operadores de conteúdo de nível superior de cada stream /Contents de página na ordem de origem

Renderização progressiva de 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 de região são pontos de espaço de usuário PDF com origem no canto inferior esquerdo e o bitmap de saída cobre exatamente essa janela no DPI solicitado

A sessão reutiliza a lista de exibição em cache, retém o estado gráfico e de texto entre chamadas e suprime pinturas caras de caminho, texto, imagem, Form e sombreamento cujos limites conservadores não cruzam a ROI

Os operadores de estado e o avanço de texto ainda são executados na ordem de origem, portanto remover uma marca anterior não pode mover ou recolorir uma marca visível posterior

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

Scans JPEG progressivos

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

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

THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded e THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded relatam contagens de scans e imagens concluídas; 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 de THPDFJpegByteArray, com resultados de THPDFJpegScanDecodeStatus e um callback opcional de THPDFJpegCancellationCheck para cancelamento em nível de linha

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

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

Callbacks de progresso

THPDFProgressiveRenderProgressEvent é executado após cada operador concluído e recebe contagens processadas e totais mais o tempo decorrido de execução de renderização

Defina o parâmetro Cancel do callback como true para finalizar aquela sessão em prsCancelled sem cancelar o token compartilhado

Um Form XObject, padrão, decodificação de imagem ou outra operação aninhada pertence ao seu operador de nível superior envolvente e pode exceder um pequeno orçamento de tempo antes que o controle retorne

Cancelamento em toda a 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 uso único e de propriedade do chamador; Cancel solicita cancelamento permanentemente e IsCancellationRequested expõe o estado

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

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

SignPDFWithPFX e SignPDFWithSystemCertificate fornecem sobrecargas que aceitam um token diretamente

Regras de propriedade e resultado parcial

APIs relacionadas