|
LZW Compression Support
Visão geral
O HotPDF decodifica streams PDF legados que usam o filtro LZWDecode e pode reverter os predictors TIFF ou PNG comumente emparelhados com esse filtro
Key Features
- Transições de largura de código
EarlyChange=1 e EarlyChange=0 do PDF
- Ordem de preenchimento bit mais significativo e bit menos significativo
- Reset por clear code, end-of-information e tratamento de expansão
KwKwK
- Saída direta para um
TStream sem construir uma segunda string de resultado
- Limites de saída configuráveis e checagens opcionais estritas de initial-clear e end-of-information
- TIFF Predictor 2 a 1, 2, 4, 8 ou 16 bits por componente
- Filtros de linha PNG None, Sub, Up, Average e Paeth
- Estatísticas por decodificação de larguras de código, crescimento do dicionário, resets, expansões e bytes de saída
Types
TPDFLZWDecompressor é a classe de decodificador reutilizável
TPDFLZWCompressor é a classe de codificador correspondente
TPDFLZWParms carrega a geometria de predictor do PDF
TPDFLZWFillOrder seleciona a ordem de bits foTop ou foBottom
EHPDFLZWError reporta entrada malformada, geometria não suportada e falhas de limite configurado
Configuration Properties
FillOrder seleciona a ordem de bits comprimida
EarlyChange seleciona a regra de transição de largura de dicionário do PDF e tem padrão True
InitialCodeSize aceita valores de 2 a 9 e tem padrão 9 para PDF
- Para alfabetos reduzidos, todo byte descomprimido precisa ser menor que
1 shl (InitialCodeSize - 1); a compressão gera EHPDFLZWError antes de gravar saída se um byte estiver fora dessa faixa
MaxOutputBytes interrompe expansão excessiva antes que o limite configurado seja cruzado, com zero significando ilimitado
RequireInitialClear exige que o primeiro código reinicie o dicionário
RequireEndOfInformation rejeita um stream que termina sem o terminador dele
Methods
function Decompress(const Input: AnsiString): AnsiString; overload;
function Decompress(const Input: AnsiString;
Parms: TPDFLZWParms): AnsiString; overload;
function TryDecompress(const Input: AnsiString;
out Output: AnsiString): Boolean; overload;
function TryDecompress(const Input: AnsiString; Parms: TPDFLZWParms;
out Output: AnsiString): Boolean; overload;
function DecompressToStream(const Input: AnsiString;
OutputStream: TStream): Int64;
function DecompressStream(InputStream, OutputStream: TStream;
RestoreInputPosition: Boolean = True): Int64;
Decompress dispara EHPDFLZWError com entrada inválida
TryDecompress retorna False e expõe o motivo por meio de LastError
DecompressToStream e DecompressStream retornam o número de bytes decodificados gravados
DecompressStream lê da posição atual de entrada e restaura essa posição por padrão quando o stream é posicionável
Basic LZW Decompression
TPDFLZWCompressor.CompressToStream e CompressStream retornam o número de bytes codificados gravados, incluindo o clear code e o código de end-of-information para entrada vazia; a configuração padrão de PDF grava 3 bytes para uma entrada vazia
uses
HPDFLZW;
procedure DecompressLZWData;
var
Decompressor: TPDFLZWDecompressor;
CompressedData: AnsiString;
DecompressedData: AnsiString;
begin
Decompressor := TPDFLZWDecompressor.Create;
try
Decompressor.FillOrder := foTop;
Decompressor.EarlyChange := True;
Decompressor.MaxOutputBytes := 64 * 1024 * 1024;
DecompressedData := Decompressor.Decompress(CompressedData);
ProcessDecompressedData(DecompressedData);
finally
Decompressor.Free;
end;
end;
Saída em stream e diagnósticos
procedure DecodeLZWToStream(const CompressedData: AnsiString;
Destination: TStream);
var
Decompressor: TPDFLZWDecompressor;
begin
Decompressor := TPDFLZWDecompressor.Create;
try
Decompressor.RequireInitialClear := True;
Decompressor.RequireEndOfInformation := True;
Decompressor.DecompressToStream(CompressedData, Destination);
LogDecodeStatistics(
Decompressor.CodesRead,
Decompressor.PeakCodeSize,
Decompressor.PeakDictionarySize,
Decompressor.OutputBytes);
finally
Decompressor.Free;
end;
end;
Predictor Parameters
Predictor=1 retorna os bytes descomprimidos inalterados
Predictor=2 reverte a diferenciação horizontal do TIFF
Predictor=10..15 reverte a tag de filtro PNG armazenada no início de cada linha
Colors, BitsPerComponent e Columns definem a geometria exata da linha
ExpandedTo8Bit e ColorSpace permanecem disponíveis por compatibilidade de código-fonte
Decode Statistics
CodesRead, ClearCodesRead e DictionaryAdds
KwKwKExpansions, PeakCodeSize e PeakDictionarySize
OutputBytes e EndedWithEndOfInformation
Error Handling
- Códigos além da próxima entrada do dicionário são rejeitados
- Cadeias de prefixos quebradas e um primeiro código inválido são rejeitados
- Entrada truncada é rejeitada quando
RequireEndOfInformation está habilitado
- A expansão da saída é checada antes de cada frase ser emitida
- Linhas de predictor devem estar completas e usar geometria válida e tag de linha PNG válida
See Also
|