Enhanced EMF/WMF Metafile Support

Overview

HotPDF는 이제 Enhanced Metafile(EMF)과 Windows Metafile(WMF) 형식을 대폭 강화하여 지원합니다. 새 구현은 자동 형식 감지, 다양한 배치 옵션, 고급 스케일링 제어를 제공하며 PDF 문서 내 벡터 그래픽의 렌더링 품질도 향상되었습니다

Key Enhancements

  • Automatic EMF/WMF format detection and appropriate processing
  • Multiple positioning options (center, top-left, custom coordinates)
  • Enhanced scaling and aspect ratio control
  • 압축, 스케일링, 참조 DC, 펜 스타일 처리, hatch 브러시 보존, null 오브젝트 진단에 대한 호출별 렌더링 옵션
  • Direct EMF rendering for vector graphics preservation
  • Bitmap conversion option for compatibility
  • Improved memory management for large metafiles
  • 복잡한 벡터 그래픽과 텍스트의 처리 개선

Position Control Options

The enhanced metafile support includes flexible positioning options:

  • mpCenter: 메타파일을 페이지 가운데에 배치합니다(기본 동작)
  • mpLeftTop: Metafile displayed at the top-left corner (X=0, Y=0)
  • mpCustom: Metafile displayed at specified position (requires X, Y parameters)

Usage Examples

Basic Usage (Default Centered Display)


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

Per-call Rendering Options


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

The enhanced EMF/WMF support introduces several new methods:

THPDFPage.ShowMetafile Overloads

  • ShowMetafile(MetaFile: TMetafile) - Default centered display
  • 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) - 그리기 한 번에 한해 EMF/WMF 옵션을 덮어쓸 수 있는 페이지 직접 API

Enhanced Processing Methods

  • EnhancedShowMetafile - Advanced processing with enhanced features
  • ShowEnhancedMetafile(Page, MetaFile, Options) - Global helper with per-call rendering options
  • ShowEnhancedMetafile(Page, MetaFile, Position, X, Y, Options) - 위치 제어와 호출별 렌더링 옵션을 지원하는 전역 헬퍼
  • ShowEnhancedMetafile(Page, FileName, Options) - File-name helper with per-call rendering options
  • ShowEnhancedMetafile(Page, FileName, Position, X, Y, Options) - 위치 제어와 호출별 렌더링 옵션을 지원하는 파일 이름 기반 헬퍼
  • RenderEmfDirect - Direct EMF rendering for vector preservation
  • RenderEmfAsBitmap - Bitmap conversion for compatibility
  • RenderWmfAsBitmap - WMF bitmap rendering with position control

Technical Implementation

향상된 EMF/WMF 지원은 HPDFEmf.pas 유닛으로 구현되며, 다음을 제공합니다

  • THPDFEmfEnhanced: Core enhancement class for EMF processing
  • THPDFEmfPatcher: EMF 변환 및 렌더링용 유틸리티 클래스
  • THPDFMetafilePosition: Enumeration for position control
  • Enhanced EMF Record Processing: Support for advanced EMF records

THPDFPageHelper와 C++ 경계

Delphi XE2 이상에서는 위에 나열된 THPDFPage.ShowMetafile과 THPDFPage.EnhancedShowMetafile overload를 HPDFEmf 유닛에 선언된 class helper인 THPDFPageHelper가 주입합니다. uses 절에 HPDFEmf를 추가하기만 하면 어떤 THPDFPage 인스턴스에서든 이들을 호출할 수 있습니다

Class helper는 Delphi 전용 언어 기능이라 C++Builder에서는 접근할 수 없습니다. C++ 호출자는 Enhanced Processing Methods 아래에 나열된 전역 ShowEnhancedMetafile(Page, MetaFile, ...) helper를 ConvertTo 데모와 똑같이 대신 사용합니다

XE2 이전 Delphi 버전에서는 같은 기능이 페이지를 첫 인자로 받는 평범한 호환성 프로시저로 노출됩니다. THPDFPage_ShowMetafile(Page, MetaFile), THPDFPage_ShowMetafile(Page, MetaFile, Position, X, Y), THPDFPage_EnhancedShowMetafile(Page, MetaFile), THPDFPage_EnhancedShowMetafile(Page, MetaFile, Position, X, Y)입니다

향상 스위치

향상 경로는 HPDFEmf의 EmfSupportEnabled: Boolean 변수가 기본값 True로 지키고 있습니다. False로 설정하면 모든 metafile 표시가 기본 렌더링 경로로 폴백합니다

opt-out한 뒤 EnableEnhancedEmfSupport를 호출하면 향상 경로를 다시 켤 수 있습니다. 데모들이 첫 ShowMetafile 호출 전에 쓰는 패턴이기도 합니다

Advanced Features

EMF Record Support

  • EMR_BITBLT - Bitmap operations
  • EMR_STRETCHDIBITS - Stretched bitmap operations
  • EMR_ALPHABLEND - Alpha blending operations
  • Enhanced text rendering
  • Complex path operations

Rendering Options

  • Vector Preservation: Maintains vector graphics quality
  • Bitmap Fallback: Automatic fallback for complex graphics
  • Scaling Options: Automatic and manual scaling control
  • Quality Control: Configurable rendering quality settings
  • Canvas Layering: Set THPDFEmfOptions.CanvasOver when existing page content should paint above replayed Canvas metafile content
  • Redraw 제어: 기본 임시 redraw 경로를 사용하려면 THPDFEmfOptions.Redraw를 활성화된 상태로 두고, 원본 메타파일을 직접 파싱하려면 비활성화합니다
  • 프레임 클리핑: 가져온 메타파일이 프레임 경계에 의존하는 경우 THPDFEmfOptions.UseFrame을 설정하면 EMF 출력이 헤더 프레임으로 클리핑됩니다
  • Hatch Brush Patterns: EMF/WMF hatch brushes map to PDF tiling patterns so imported drawings keep their fill texture
  • Null 오브젝트 진단: 기본적으로 null 펜과 null 브러시는 보이지 않게 유지되며, 진단 목적으로 해당 경로나 채움을 보이게 해야 하면 THPDFEmfOptions.ShowNullPen과 THPDFEmfOptions.ShowNullBrush를 설정합니다

Performance Optimizations

  • Memory-efficient processing for large metafiles
  • Optimized EMF record parsing
  • Intelligent caching for repeated elements
  • Reduced memory footprint during conversion

Compatibility and Standards

  • Windows EMF 1.0 and Enhanced EMF support
  • Windows Metafile (WMF) backward compatibility
  • Cross-platform rendering consistency
  • PDF vector graphics standards compliance

Troubleshooting

Common Issues and Solutions:

  • 대형 메타파일: 매우 크거나 복잡한 메타파일은 비트맵 렌더링을 사용하십시오
  • 텍스트 렌더링: 대상 시스템에서 글꼴을 사용할 수 있는지 확인하십시오
  • Complex Graphics: Consider direct EMF rendering for better quality
  • Positioning Issues: Use custom positioning for precise placement

See Also