Suporte aprimorado a metafiles EMF/WMF

Visão geral

O HotPDF agora oferece suporte significativamente aprimorado aos formatos Enhanced Metafile (EMF) e Windows Metafile (WMF). A nova implementação inclui detecção automática de formato, múltiplas opções de posicionamento, controle avançado de escala e qualidade de renderização melhorada para gráficos vetoriais em documentos PDF

Key Enhancements

  • Detecção automática de formato EMF/WMF e processamento adequado
  • Múltiplas opções de posicionamento (centro, canto superior esquerdo, coordenadas personalizadas)
  • Controle aprimorado de escala e proporção
  • Opções de renderização por chamada para compressão, escala, DC de referência, tratamento de estilo de caneta, preservação de hatch brush e diagnósticos de objetos nulos
  • Renderização EMF direta para preservação de gráficos vetoriais
  • Opção de conversão para bitmap por compatibilidade
  • Gerenciamento de memória melhorado para metafiles grandes
  • Tratamento melhor de gráficos vetoriais complexos e de texto

Position Control Options

The enhanced metafile support includes flexible positioning options:

  • mpCenter: Metafile centralizado na página (comportamento padrão)
  • mpLeftTop: Metafile exibido no canto superior esquerdo (X=0, Y=0)
  • mpCustom: Metafile exibido na posição especificada (exige parâmetros X, Y)

Usage Examples

Uso básico (exibição centralizada padrão)


// Delphi example - Default centered display
procedure ShowMetafileDefault;
var
  PDF: THotPDF;
  MetaFile: TMetafile;
begin
  PDF := THotPDF.Create(nil);
  MetaFile := TMetafile.Create;
  try
    PDF.BeginDoc;
    PDF.AddPage;

    // Load metafile
    MetaFile.LoadFromFile('diagram.emf');

    // Display centered on page (default)
    PDF.CurrentPage.ShowMetafile(MetaFile);

    PDF.EndDoc;
  finally
    MetaFile.Free;
    PDF.Free;
  end;
end;
        

Position Control Usage


// Delphi example - Advanced positioning
procedure ShowMetafileAdvanced;
var
  PDF: THotPDF;
  MetaFile: TMetafile;
begin
  PDF := THotPDF.Create(nil);
  MetaFile := TMetafile.Create;
  try
    PDF.BeginDoc;
    PDF.AddPage;

    MetaFile.LoadFromFile('chart.wmf');

    // Top-left corner display
    PDF.CurrentPage.ShowMetafile(MetaFile, mpLeftTop);

    // Custom position display
    PDF.CurrentPage.ShowMetafile(MetaFile, mpCustom, 100, 200);

    PDF.EndDoc;
  finally
    MetaFile.Free;
    PDF.Free;
  end;
end;
        

Opções de renderização por chamada


// Delphi example - Per-call options
procedure ShowMetafileWithOptions;
var
  PDF: THotPDF;
  MetaFile: TMetafile;
  Options: THPDFEmfOptions;
begin
  PDF := THotPDF.Create(nil);
  MetaFile := TMetafile.Create;
  Options := THPDFEmfOptions.Create;
  try
    Options.EmfBitmapScale := 1;
    Options.ColorImageCompression := icFlate;
    Options.UseScreenReferenceDC := False;
    Options.CanvasOver := True;
    Options.Redraw := False;
    Options.UseFrame := True;
    Options.ShowNullPen := True;
    Options.ShowNullBrush := True;

    PDF.BeginDoc;
    PDF.AddPage;
    MetaFile.LoadFromFile('diagram.emf');
    PDF.CurrentPage.ShowMetafile(MetaFile, mpCenter, 0, 0, Options);
    PDF.EndDoc;
  finally
    Options.Free;
    MetaFile.Free;
    PDF.Free;
  end;
end;
        

Enhanced Methods

O suporte aprimorado a EMF/WMF introduz vários métodos novos:

THPDFPage.ShowMetafile Overloads

  • ShowMetafile(MetaFile: TMetafile) - exibição centralizada padrão
  • ShowMetafile(MetaFile: TMetafile; Position: THPDFMetafilePosition) - controle de posição
  • ShowMetafile(MetaFile: TMetafile; Position: THPDFMetafilePosition; X, Y: Single) - posicionamento personalizado
  • ShowMetafile(MetaFile: TMetafile; Options: THPDFEmfOptions) - opções de renderização por chamada
  • ShowMetafile(MetaFile: TMetafile; Position: THPDFMetafilePosition; X, Y: Single; Options: THPDFEmfOptions) - controle de posição com opções de renderização por chamada
  • ShowMetafileEx(MetaFile: TMetafile; Options: THPDFEmfOptions) - API direta de página com uma sobrescrita de opções EMF/WMF para um único desenho

Enhanced Processing Methods

  • EnhancedShowMetafile - processamento avançado com features aprimoradas
  • ShowEnhancedMetafile(Page, MetaFile, Options) - helper global com opções de renderização por chamada
  • ShowEnhancedMetafile(Page, MetaFile, Position, X, Y, Options) - helper global com controle de posição e opções de renderização por chamada
  • ShowEnhancedMetafile(Page, FileName, Options) - helper por nome de arquivo com opções de renderização por chamada
  • ShowEnhancedMetafile(Page, FileName, Position, X, Y, Options) - helper por nome de arquivo com controle de posição e opções de renderização por chamada
  • RenderEmfDirect - renderização EMF direta para preservação vetorial
  • RenderEmfAsBitmap - conversão para bitmap por compatibilidade
  • RenderWmfAsBitmap - renderização de bitmap WMF com controle de posição

Technical Implementation

O suporte aprimorado a EMF/WMF é implementado pela unidade HPDFEmf.pas, que fornece:

  • THPDFEmfEnhanced: classe central de aprimoramento para processamento EMF
  • THPDFEmfPatcher: classe utilitária para conversão e renderização EMF
  • THPDFMetafilePosition: enumeração para controle de posição
  • Enhanced EMF Record Processing: Suporte a registros EMF avançados

THPDFPageHelper e a fronteira com o C++

No Delphi XE2 e posteriores, as overloads de THPDFPage.ShowMetafile e THPDFPage.EnhancedShowMetafile listadas acima são injetadas por THPDFPageHelper, um class helper declarado na unidade HPDFEmf; basta adicionar HPDFEmf à cláusula uses para chamá-las em qualquer instância de THPDFPage

Class helpers são um recurso exclusivo da linguagem Delphi e ficam inacessíveis no C++Builder: chamadores C++ usam os helpers globais ShowEnhancedMetafile(Page, MetaFile, ...) listados em Enhanced Processing Methods, exatamente como faz a demo ConvertTo

Em versões do Delphi anteriores ao XE2, a mesma funcionalidade é exposta como procedures de compatibilidade simples que recebem a página como primeiro argumento: THPDFPage_ShowMetafile(Page, MetaFile), THPDFPage_ShowMetafile(Page, MetaFile, Position, X, Y), THPDFPage_EnhancedShowMetafile(Page, MetaFile) e THPDFPage_EnhancedShowMetafile(Page, MetaFile, Position, X, Y)

Chave de aprimoramento

O caminho aprimorado é controlado pela variável EmfSupportEnabled: Boolean em HPDFEmf, com padrão True; defini-la como False faz toda exibição de metafile cair no caminho básico de renderização

Chame EnableEnhancedEmfSupport para religar o caminho aprimorado depois de uma desativação, que é o padrão que as demos usam antes da primeira chamada a ShowMetafile

Advanced Features

EMF Record Support

  • EMR_BITBLT - operações de bitmap
  • EMR_STRETCHDIBITS - operações de bitmap esticado
  • EMR_ALPHABLEND - operações de alpha blending
  • Renderização de texto aprimorada
  • Operações complexas de path

Rendering Options

  • Vector Preservation: Mantém a qualidade dos gráficos vetoriais
  • Bitmap Fallback: Fallback automático para gráficos complexos
  • Scaling Options: Controle de escala automático e manual
  • Quality Control: Configurações de qualidade de renderização ajustáveis
  • Canvas Layering: Defina THPDFEmfOptions.CanvasOver quando o conteúdo existente da página deve pintar acima do conteúdo de Canvas do metafile reproduzido
  • Redraw Control: Deixe THPDFEmfOptions.Redraw habilitado para o caminho padrão de redesenho temporário, ou desabilite-o para parsear o metafile original diretamente
  • Frame Clipping: Defina THPDFEmfOptions.UseFrame para fazer o clip da saída EMF ao frame do header quando os metafiles importados dependerem dos limites do frame
  • Hatch Brush Patterns: Hatch brushes EMF/WMF mapeiam para padrões de tiling PDF, de modo que os desenhos importados mantenham a textura de preenchimento
  • Null Object Diagnostics: Mantenha null pens e null brushes invisíveis por padrão, ou defina THPDFEmfOptions.ShowNullPen e THPDFEmfOptions.ShowNullBrush quando os diagnósticos precisarem que esses paths ou preenchimentos fiquem visíveis

Performance Optimizations

  • Processamento eficiente em memória para metafiles grandes
  • Parse otimizado de registros EMF
  • Cache inteligente para elementos repetidos
  • Menor pegada de memória durante a conversão

Compatibilidade e padrões

  • Suporte a Windows EMF 1.0 e Enhanced EMF
  • Compatibilidade retroativa com Windows Metafile (WMF)
  • Consistência de renderização entre plataformas
  • Conformidade com os padrões de gráficos vetoriais PDF

Troubleshooting

Common Issues and Solutions:

  • Large Metafiles: Use renderização em bitmap para metafiles muito grandes ou complexos
  • Text Rendering: Garanta que as fontes estejam disponíveis no sistema alvo
  • Complex Graphics: Considere a renderização EMF direta para melhor qualidade
  • Positioning Issues: Use posicionamento personalizado para colocação precisa

See Also