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
- O documento e o token têm de sobreviver a todas as
THPDFLoadedPageRenderSessionque os referenciem - Um carregamento cancelado pode ser seguido de um carregamento fresco na mesma instância de documento
- A otimização de streams é cooperativa e não transacional, pelo que as streams concluídas antes do cancelamento permanecem otimizadas
- Um destino de assinatura cancelado pode conter saída parcial e deve ser descartado quando é exigida entrega atómica
- Uma chamada a um provider de chaves privadas Windows não pode ser interrompida em segurança, pelo que o cancelamento é observado imediatamente antes e depois dessa chamada
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