Soporte mejorado de metafiles EMF/WMF

Visión general

HotPDF proporciona ahora un soporte significativamente mejorado de los formatos Enhanced Metafile (EMF) y Windows Metafile (WMF). La nueva implementación incluye detección automática de formato, múltiples opciones de posicionamiento, control avanzado de escalado y una calidad de renderizado mejorada para gráficos vectoriales en documentos PDF

Mejoras clave

  • Detección automática del formato EMF/WMF y procesamiento apropiado
  • Múltiples opciones de posicionamiento (centro, arriba a la izquierda, coordenadas personalizadas)
  • Escalado mejorado y control de la relación de aspecto
  • Opciones de renderizado por llamada para compresión, escalado, DC de referencia, manejo de estilos de pluma, preservación de brochas de tramado y diagnósticos de objetos nulos
  • Renderizado EMF directo para preservar los gráficos vectoriales
  • Opción de conversión a bitmap por compatibilidad
  • Gestión de memoria mejorada para metafiles grandes
  • Mejor manejo de gráficos vectoriales complejos y de texto

Opciones de control de posición

El soporte de metafiles mejorados incluye opciones de posicionamiento flexibles:

  • mpCenter: Metafile centrado en la página (comportamiento por defecto)
  • mpLeftTop: Metafile mostrado en la esquina superior izquierda (X=0, Y=0)
  • mpCustom: Metafile mostrado en la posición especificada (requiere parámetros X, Y)

Ejemplos de uso

Uso básico (presentación centrada por defecto)


// 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;
        

Uso del control de posición


// 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;
        

Opciones de renderizado por llamada


// 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;
        

Métodos mejorados

El soporte mejorado de EMF/WMF introduce varios métodos nuevos:

Sobrecargas de THPDFPage.ShowMetafile

  • ShowMetafile(MetaFile: TMetafile) - visualización centrada por defecto
  • ShowMetafile(MetaFile: TMetafile; Position: THPDFMetafilePosition) - Position control
  • ShowMetafile(MetaFile: TMetafile; Position: THPDFMetafilePosition; X, Y: Single) - Custom positioning
  • ShowMetafile(MetaFile: TMetafile; Options: THPDFEmfOptions) - Per-call rendering options
  • ShowMetafile(MetaFile: TMetafile; Position: THPDFMetafilePosition; X, Y: Single; Options: THPDFEmfOptions) - Position control with per-call rendering options
  • ShowMetafileEx(MetaFile: TMetafile; Options: THPDFEmfOptions) - API directa de página con una sobrescritura de las opciones EMF/WMF para un único dibujo

Métodos de procesado mejorado

  • EnhancedShowMetafile - procesamiento avanzado con funcionalidades mejoradas
  • ShowEnhancedMetafile(Page, MetaFile, Options) - helper global con opciones de renderizado por llamada
  • ShowEnhancedMetafile(Page, MetaFile, Position, X, Y, Options) - helper global con control de posición y opciones de renderizado por llamada
  • ShowEnhancedMetafile(Page, FileName, Options) - helper por nombre de archivo con opciones de renderizado por llamada
  • ShowEnhancedMetafile(Page, FileName, Position, X, Y, Options) - helper por nombre de archivo con control de posición y opciones de renderizado por llamada
  • RenderEmfDirect - Renderizado EMF directo para preservar vectores
  • RenderEmfAsBitmap - Conversión a bitmap por compatibilidad
  • RenderWmfAsBitmap - Renderizado WMF a bitmap con control de posición

Implementación técnica

El soporte mejorado de EMF/WMF está implementado mediante la unidad HPDFEmf.pas, que proporciona:

  • THPDFEmfEnhanced: clase de mejora principal para el procesado de EMF
  • THPDFEmfPatcher: clase de utilidad para conversión y renderizado de EMF
  • THPDFMetafilePosition: enumeración para control de posición
  • Procesado de registros EMF mejorados: soporte de registros EMF avanzados

THPDFPageHelper y el límite con C++

En Delphi XE2 y posteriores, las sobrecargas THPDFPage.ShowMetafile y THPDFPage.EnhancedShowMetafile listadas arriba las inyecta THPDFPageHelper, un class helper declarado en la unidad HPDFEmf, de modo que basta añadir HPDFEmf a la cláusula uses para poder llamarlas sobre cualquier instancia de THPDFPage

Los class helpers son una característica exclusiva del lenguaje Delphi y no son accesibles desde C++Builder: los llamadores de C++ usan en su lugar los helpers globales ShowEnhancedMetafile(Page, MetaFile, ...) listados bajo Métodos de procesado mejorado, exactamente igual que hace el demo ConvertTo

En versiones de Delphi anteriores a XE2, la misma funcionalidad se expone como procedimientos de compatibilidad sencillos que reciben la página como primer argumento: THPDFPage_ShowMetafile(Page, MetaFile), THPDFPage_ShowMetafile(Page, MetaFile, Position, X, Y), THPDFPage_EnhancedShowMetafile(Page, MetaFile) y THPDFPage_EnhancedShowMetafile(Page, MetaFile, Position, X, Y)

Interruptor de mejora

La ruta mejorada está protegida por la variable EmfSupportEnabled: Boolean de HPDFEmf, con valor por defecto True; asignarle False hace que toda visualización de metafiles recurra a la ruta de renderizado básica

Llame a EnableEnhancedEmfSupport para reactivar la ruta mejorada tras una desactivación, que es el patrón que los demos usan antes de su primera llamada a ShowMetafile

Características avanzadas

Soporte de registros EMF

  • EMR_BITBLT - Operaciones de bitmap
  • EMR_STRETCHDIBITS - Operaciones de bitmap estirado
  • EMR_ALPHABLEND - Operaciones de mezcla alfa
  • Renderizado de texto mejorado
  • Operaciones de path complejas

Opciones de renderizado

  • Preservación vectorial: mantiene la calidad de los gráficos vectoriales
  • Fallback a bitmap: fallback automático para gráficos complejos
  • Opciones de escalado: control de escalado automático y manual
  • Control de calidad: ajustes de calidad de renderizado configurables
  • Capas de canvas: establezca THPDFEmfOptions.CanvasOver cuando el contenido existente de la página deba pintar sobre el contenido de canvas del metafile reproducido
  • Control de redibujado: deje THPDFEmfOptions.Redraw activado para la ruta temporal de redibujado por defecto, o desactívelo para parsear el metafile original directamente
  • Recorte de marco: establezca THPDFEmfOptions.UseFrame para recortar la salida EMF al marco de cabecera cuando los metafiles importados dependan de los límites del marco
  • Patrones de hatch brush: los hatch brushes EMF/WMF se mapean a tiling patterns PDF para que los dibujos importados conserven su textura de relleno
  • Diagnóstico de objetos nulos: mantenga plumas y brochas nulas invisibles por defecto, o establezca THPDFEmfOptions.ShowNullPen y THPDFEmfOptions.ShowNullBrush cuando el diagnóstico necesite hacer visibles esos trazos o rellenos

Optimizaciones de rendimiento

  • Procesado eficiente en memoria para metafiles grandes
  • Parseo de registros EMF optimizado
  • Cacheo inteligente de elementos repetidos
  • Huella de memoria reducida durante la conversión

Compatibilidad y estándares

  • Soporte de Windows EMF 1.0 y Enhanced EMF
  • Compatibilidad hacia atrás con Windows Metafile (WMF)
  • Consistencia de renderizado entre plataformas
  • Conformidad con los estándares de gráficos vectoriales PDF

Solución de problemas

Problemas comunes y soluciones:

  • Metafiles grandes: use renderizado a bitmap para metafiles muy grandes o complejos
  • Renderizado de texto: asegúrese de que las fuentes estén disponibles en el sistema de destino
  • Gráficos complejos: considere el renderizado EMF directo para mejor calidad
  • Problemas de posicionamiento: use posicionamiento personalizado para una colocación precisa

Véase también