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
- O documento e o token devem sobreviver a toda
THPDFLoadedPageRenderSessionque os referencia - Um carregamento cancelado pode ser seguido por um novo carregamento na mesma instância de documento
- A otimização de stream é cooperativa em vez de transacional, portanto streams concluídos antes do cancelamento permanecem otimizados
- Um destino de assinatura cancelado pode conter saída parcial e deve ser descartado quando a entrega atômica for exigida
- Uma chamada de provedor de chave privada do Windows não pode ser interrompida com segurança, portanto o cancelamento é observado imediatamente antes e depois dessa chamada