Método THotPDF.DecodeLoadedStreamToStream
Descodifica um fluxo PDF carregado através da sua cadeia de filtros completa e escreve a fase final diretamente para um fluxo pertencente ao chamador
Declaração
function DecodeLoadedStreamToStream(AStream: THPDFStreamObject; Output: TStream; out Info: THPDFDecodePipelineInfo): boolean;
Unit
HPDFDoc
Parâmetros
| Nome | Objetivo |
|---|---|
AStream | THPDFStreamObject carregado cuja entrada /Filter é descodificada |
Output | Destino da propriedade de quem chama, que recebe os bytes descodificados na posição atual |
Output | Destino pertencente ao chamador que recebe os bytes descodificados na sua posição atual |
Info | Recebe contagens de bytes de entrada e saída, contagens de filtros, profundidade, estado, filtro falhado e diagnósticos |
Valor devolvido
Devolve True apenas quando todas as fases pedidas têm sucesso
Notas de utilização
- O filtro final escreve para
Outputsem criar um segundo fluxo de memória final de tamanho completo - As fases intermédias usam
THPDFAdaptiveTempStreame transbordam para ficheiros temporários próprios apósLoadedStreamMemoryThreshold - Cada fase permanece limitada por
DecodeBudgetBytese cada byte descodificado consome tambémDocumentDecodeBudgetBytes - ASCII85 exige um marcador de fim exato
~>e ASCIIHex exige>; os pipelines carregados malformados falham em vez de aceitarem dados truncados DecodeFilterLimitrejeita matrizes demasiado grandes antes da alocação da faseDecodePipelineDepthLimit, deteção de referências indiretas cíclicas e deteção de recursão do mesmo fluxo limitam grafos de objetos hostis- A posição do fluxo de origem é restaurada após sucesso ou falha
- Os estágios
IHPDFCustomStreamFilterregistados partilham os mesmos orçamentos agregados e a mesma profundidade de pipeline - A saída personalizada de push e pull fica isolada numa stream temporária adaptativa até esse estágio personalizado ter sucesso
- A overload com cancelamento devolve
dpsCancelledem vez de deixar escaparEHPDFOperationCancelled - Um destino de streaming falhado pode conter bytes já aceites antes da falha; use um destino temporário quando for exigida saída atómica
Diagnósticos
THPDFDecodePipelineInfo = record
Status: THPDFDecodePipelineStatus;
InputBytes: Int64;
OutputBytes: Int64;
FilterCount: Integer;
AppliedFilterCount: Integer;
PipelineDepth: Integer;
StopBeforeLast: Boolean;
FailedFilter: AnsiString;
Diagnostic: AnsiString;
end;
Status distingue fluxos e filtros inválidos, limites de contagem de filtros e de profundidade, referências cíclicas, fluxos recursivos, filtros não suportados, falhas de orçamento e falhas de descodificador
Exemplo
Output := TFileStream.Create('payload.bin', fmCreate);
try
if not PDF.DecodeLoadedStreamToStream(StreamObject, Output, Info) then
raise Exception.Create(String(Info.Diagnostic));
finally
Output.Free;
end;