Document Handlers opcionais
THPDFDocumentHandlerRegistry seleciona handlers substituíveis pelo conteúdo inspecionado, antes de pistas fracas de extensão ou MIME, e depois converte a origem escolhida numa única cache PDF imutável partilhada pela exportação e pela renderização
Handlers opcionais integrados
- XPS e OpenXPS retêm as dimensões de páginas fixas e a ordem visual, convertem geometria
Pathabreviada com self-closing ou propriedades em vetores PDF nativos, preservam brushes sólidos via atributos e elementos de propriedade, padrões de shading multi-stopLinearGradientBrusheRadialGradientBrushelíptico, e preenchem paths através de recursosImageBrushde pacote JPEG, PNG, TIFF ou JPEG XR comTileMode=None - Os preenchimentos de imagem XPS suportam o mapeamento absoluto ou
RelativeToBoundingBoxdeViewboxeViewport, os modos de tileNone,Tile,FlipX,FlipYeFlipXY, clipping nativo de path e de posicionamento, atributosTransformfinitos de seis parâmetros ou elementosImageBrush.TransformMatrixTransform, opacidade de brush e de path, alfa de soft mask PNG, DPI da imagem e cache de recursos do pacote - O
Path.OpacityMaskdo XPS suporta máscaras sólidas, gradientes lineares multi-stop ou radiais elípticos eImageBrushPNG, incluindo células de imagem repetidas e refletidas; o alfa uniforme é integrado nos graphics states existentes, enquanto o alfa variável usa grupos de transparência DeviceGray nativos e delimitados, que partilham shading patterns e streams de soft mask de imagem - A
Opacityde Canvas XPS e oCanvas.OpacityMaskcompõem descendentes sobrepostos uma única vez através de Form XObjects DeviceRGB isolados, em vez de atenuar cada filho independentemente; o alfa uniforme da máscara é dobrado no estado do grupo, o alfa variável de gradientes ou de imagens PNG reutiliza recursos nativos de soft mask, e os grupos aninhados retêm clips transformados, propriedade de recursos e anotações de link limitadas, dentro dos limites de 4 096 grupos e 16 MiB de conteúdo capturado por grupo - O
VisualBrushdo XPS converte recursivamente visuaisCanvas,PatheGlyphsinline ou suportados por recursos, resolve âmbitosResourceDictionaryaninhados e remotos, mapeia umViewboxabsoluto para umViewportabsoluto ou relativo e reutiliza um único Form XObject PDF delimitado em posicionamentos diretos, em tile e refletidos - O
Canvas.Clipdo XPS aceita geometria abreviada delimitada, valoresStaticResourcePathGeometrylocais ou remotos e property elements diretos com figuras estruturadas de linha, Bézier, quadráticas ou de arco, transformações de geometria, geometria vazia e regras de preenchimentoEvenOddouNonZero; os clips aninhados tornam-se paths PDF nativosW*ouW, os retângulos de navegação são intersetados com os limites do clip transformado ativo, o parsing está limitado a 100.000 valores numéricos, e os clips malformados ou singulares falham em modo fechado antes de os visuais filhos serem pintados - O
Glyphsdo XPS aceita no máximo 65.536 mapeamentosIndicesestritos, mantém a progressão de clusters um-para-muitos e muitos-para-um, advances explícitos em centésimos de em, offsets horizontais e verticais, progressão inversa paraBidiLevelímpar, preenchimentos sólidos como atributo ou property element, opacidade, extração de Unicode e diagnósticos de entrada malformada em modo fechado; as runs simples usam arrays PDFTJnativos e os buffers de mapeamento grandes crescem com custo linear amortizado - Os recursos
FontUride pacote suportam programas TrueType e OpenType, fragmentos de membros TTC e fontes XPS ofuscadas por GUID; IDs de glifos exatos, runs derivados de cmap, clusters, avanços, offsets, origens RTL, reutilização de recursos de fonte, permissões de embedding, subsetting opcional e mapas de extraçãoToUnicodepermanecem dados nativos de fontes PDF, sem substituição via GDI - O
FixedPage.NavigateUrido XPS em visuaisPatheGlyphstransformados passa a ser uma anotação de ligação PDF nativa, com limites derivados da geometria ou das métricas; as ligações HTTP, HTTPS e mail continuam a ser ações URI, enquanto as páginas relativas ao pacote e os fragmentosLinkTargetdescodificados de percent-encoding passam a ações GoTo para a frente ou para trás depois de todas as páginas estarem disponíveis - Um
FixedPage.NavigateUride Canvas torna-se o alvo herdado de cada visual descendentePath,Glyphsou Canvas aninhado, até um descendente fornecer o seu próprio URI; os alvos por âmbito restauram-se depois de substituições aninhadas, seguem a geometria e a transformação de cada visual, permanecem constrangidos pelos clips de Canvas ativos, sobrevivem à captura em grupos de opacidade isolados e ficam suprimidos dentro de Forms reutilizáveis deVisualBrush - A navegação está limitada a 65 536 ligações com 8 192 carateres por URI, é verificada quanto ao cancelamento durante a publicação, fica suprimida durante a captura reutilizável de
VisualBrush, e é rejeitada perante carateres de controlo, esquemas inseguros, alvos em falta ou discrepâncias de caminho e de fragmento RelativeTransformfora da norma, recursos de matriz não resolvidos, propagação de gradiente Repeat ou Reflect, interpolação não sRGB, brushes de pintura com alfa variável, conversão de cor, strokes de imagem, viewboxes relativos deVisualBrush, simulação de estilo, glifos sideways e propriedades avançadas de stroke continuam a ser diagnósticos explícitos- EPUB resolve
container.xml, o manifest e a ordem do spine, e depois usa o importador limitado de paged-media HTML5 com recursos de pacote apenas via callback - CBZ reconhece entradas de imagem suportadas, aplica ordem natural determinística de nomes de ficheiros e cria uma página por imagem no DPI de imagem configurado
Orçamentos e isolamento de falhas
Uma única varredura validada do central-directory ZIP impõe limites de entradas, bytes comprimidos, bytes expandidos, por entrada, caminhos duplicados, caminhos inseguros e rácio de compressão antes da conversão
Entradas ZipCrypto PKZIP clássicas podem pedir credenciais através de ArchivePasswordCallback; o callback recebe o nome da origem, o nome da entrada e o número da tentativa com base um, enquanto MaxPasswordAttempts limita as repetições de 1 a 16
As credenciais e os bytes parcialmente descodificados das entradas permanecem em memória e são limpos entre tentativas, o cancelamento é verificado antes e depois de cada callback, e callbacks em falta, credenciais recusadas, repetições esgotadas ou encriptação não suportada falham de forma fechada
O ZipCrypto é proteção por palavra-passe legada, e não encriptação autenticada moderna, e as convenções de bytes de palavras-passe não ASCII podem variar entre produtores de ZIP
As entradas protegidas por palavra-passe precisam do Delphi 12 ou posterior, cujo System.Zip expõe o hook de desencriptação; compilados com uma versão anterior do Delphi, os handlers continuam a ler entradas não encriptadas, mas rejeitam as encriptadas como não suportadas antes de ArchivePasswordCallback ser chamado
As entradas cujos tamanhos ou offsets precisam de campos ZIP64 requerem o Delphi 11 ou posterior; versões anteriores do Delphi rejeitam-nas como não suportadas
Os limites de recursos, reflow, páginas, píxeis, DPI, saída e cancelamento permanecem ativos durante toda a conversão e renderização, enquanto uma publicação de saída falhada restaura uma stream de destino seekable
Registo e utilização
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;