Optional Document Handlers

THPDFDocumentHandlerRegistry seleciona handlers substituíveis pelo conteúdo inspecionado antes de dicas fracas de extensão ou MIME, e depois converte a origem selecionada em um cache PDF imutável compartilhado por exportação e renderização

Handlers opcionais embutidos

Orçamentos e isolamento de falhas

Um único scan validado do central directory do ZIP impõe limites de entradas, bytes comprimidos, bytes expandidos, por entrada, paths duplicados, paths inseguros e razão de compressão antes da conversão

Entradas ZipCrypto do PKZIP clássico podem pedir credenciais por meio de ArchivePasswordCallback; o callback recebe o nome da origem, o nome da entrada e um número de tentativa de base um, enquanto MaxPasswordAttempts limita as retries de 1 a 16

Credenciais e bytes de entrada parcialmente decodificados permanecem em memória e são limpos entre tentativas, o cancelamento é checado antes e depois de todo callback, e callbacks ausentes, credenciais declinadas, retries esgotadas ou criptografia não suportada falham fechados

ZipCrypto é proteção por senha legada em vez de criptografia autenticada moderna, e as convenções de bytes de senha não ASCII podem variar entre produtores de ZIP

Entradas protegidas por senha precisam de Delphi 12 ou posterior, cujo System.Zip expõe o hook de descriptografia; construídos com uma versão anterior do Delphi, os handlers ainda leem entradas não criptografadas, mas rejeitam as criptografadas como não suportadas antes que ArchivePasswordCallback seja chamado

Entradas cujos tamanhos ou offsets precisam de campos ZIP64 exigem Delphi 11 ou posterior; versões anteriores do Delphi as rejeitam como não suportadas

Limites de recursos, reflow, página, pixel, DPI, saída e cancelamento permanecem ativos durante toda a conversão e renderização, enquanto a publicação de saída falha restaura um stream de destino posicionável

Registro e uso

var
  Registry: THPDFDocumentHandlerRegistry;
  Options: THPDFDocumentHandlerOptions;
  Handled: IHPDFHandledDocument;
  Info: THPDFDocumentHandlerInfo;
begin
  Registry:= THPDFDocumentHandlerRegistry.Create;
  try
    Registry.RegisterStandardHandlers;
    Options:= THPDFDocumentHandlerOptions.Default;
    Options.ArchivePasswordCallback:= SupplyArchivePassword;
    if Registry.OpenFromFile('book.epub', '', Options, Handled, Info) then
      Handled.WritePDF(OutputStream, Options, Info);
  finally
    Registry.Free;
  end;
end;

APIs relacionadas