Расширенная поддержка метафайлов EMF/WMF

Обзор

HotPDF теперь даёт существенно расширенную поддержку форматов Enhanced Metafile (EMF) и Windows Metafile (WMF). Новая реализация включает автоматическое определение формата, несколько опций позиционирования, продвинутое управление масштабированием и улучшенное качество отрисовки векторной графики в PDF-документах.

Ключевые улучшения

  • Автоматическое определение формата EMF/WMF и соответствующая обработка
  • Несколько опций позиционирования (центр, левый верх, свои координаты)
  • Расширенное управление масштабированием и пропорциями
  • Опции отрисовки на вызов для сжатия, масштабирования, reference DC, обращения с pen-стилями, сохранения hatch-кистей и диагностики null-объектов
  • Прямая отрисовка EMF ради сохранения векторной графики
  • Опция конверсии в битмап ради совместимости
  • Улучшенное управление памятью для больших метафайлов
  • Лучшая обработка сложной векторной графики и текста

Опции управления позицией

Расширенная поддержка метафайлов включает гибкие опции позиционирования:

  • mpCenter: Метафайл по центру страницы (поведение по умолчанию)
  • mpLeftTop: Метафайл в левом верхнем углу (X=0, Y=0)
  • mpCustom: Метафайл в указанной позиции (нужны параметры X, Y)

Примеры использования

Базовое использование (умолчальный показ по центру)


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

Использование управления позицией


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

Опции отрисовки на вызов


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

Расширенные методы

Расширенная поддержка EMF/WMF вводит несколько новых методов:

Перегрузки THPDFPage.ShowMetafile

  • ShowMetafile(MetaFile: TMetafile) — умолчальный показ по центру
  • ShowMetafile(MetaFile: TMetafile; Position: THPDFMetafilePosition) — управление позицией
  • ShowMetafile(MetaFile: TMetafile; Position: THPDFMetafilePosition; X, Y: Single) — своё позиционирование
  • ShowMetafile(MetaFile: TMetafile; Options: THPDFEmfOptions) — опции отрисовки на вызов
  • ShowMetafile(MetaFile: TMetafile; Position: THPDFMetafilePosition; X, Y: Single; Options: THPDFEmfOptions) — управление позицией с опциями отрисовки на вызов
  • ShowMetafileEx(MetaFile: TMetafile; Options: THPDFEmfOptions) — прямой API страницы с переопределением опций EMF/WMF на один вызов отрисовки

Расширенные методы обработки

  • EnhancedShowMetafile — продвинутая обработка с расширенными возможностями
  • ShowEnhancedMetafile(Page, MetaFile, Options) — глобальный хелпер с опциями отрисовки на вызов
  • ShowEnhancedMetafile(Page, MetaFile, Position, X, Y, Options) — глобальный хелпер с управлением позицией и опциями отрисовки на вызов
  • ShowEnhancedMetafile(Page, FileName, Options) — хелпер по имени файла с опциями отрисовки на вызов
  • ShowEnhancedMetafile(Page, FileName, Position, X, Y, Options) — хелпер по имени файла с управлением позицией и опциями отрисовки на вызов
  • RenderEmfDirect — прямая отрисовка EMF ради сохранения векторов
  • RenderEmfAsBitmap — конверсия в битмап ради совместимости
  • RenderWmfAsBitmap — битмап-отрисовка WMF с управлением позицией

Техническая реализация

Расширенная поддержка EMF/WMF реализована в юните HPDFEmf.pas, который даёт:

  • THPDFEmfEnhanced: Основной класс расширений для обработки EMF
  • THPDFEmfPatcher: Утилитарный класс конверсии и отрисовки EMF
  • THPDFMetafilePosition: Перечисление для управления позицией
  • Расширенная обработка EMF-записей: Поддержка продвинутых EMF-записей

THPDFPageHelper и граница C++

В Delphi XE2 и новее перечисленные выше перегрузки THPDFPage.ShowMetafile и THPDFPage.EnhancedShowMetafile инжектируются class helper'ом THPDFPageHelper, объявленным в юните HPDFEmf, так что достаточно добавить HPDFEmf в uses, чтобы вызывать их на любом экземпляре THPDFPage

Class helper'ы — фича только Delphi, из C++Builder они недоступны: вызывающие на C++ используют глобальные хелперы ShowEnhancedMetafile(Page, MetaFile, ...) из раздела методов расширенной обработки — ровно так же, как это делает демо ConvertTo

В Delphi старше XE2 та же функциональность доступна как обычные compatibility-процедуры, принимающие страницу первым аргументом: THPDFPage_ShowMetafile(Page, MetaFile), THPDFPage_ShowMetafile(Page, MetaFile, Position, X, Y), THPDFPage_EnhancedShowMetafile(Page, MetaFile) и THPDFPage_EnhancedShowMetafile(Page, MetaFile, Position, X, Y)

Переключатель расширения

Расширенный путь охраняется переменной EmfSupportEnabled: Boolean в HPDFEmf, по умолчанию True; установка её в False заставляет каждый вывод метафайла откатываться к базовому пути отрисовки

После отказа вызовите EnableEnhancedEmfSupport, чтобы включить расширенный путь обратно — демо делают это перед первым вызовом ShowMetafile

Продвинутые возможности

Поддержка EMF-записей

  • EMR_BITBLT — битмап-операции
  • EMR_STRETCHDIBITS — растянутые битмап-операции
  • EMR_ALPHABLEND — операции альфа-смешивания
  • Расширенная отрисовка текста
  • Сложные операции путей

Опции отрисовки

  • Сохранение векторов: Сохраняет качество векторной графики
  • Битмап-fallback: Автоматический fallback для сложной графики
  • Опции масштабирования: Автоматическое и ручное управление масштабом
  • Управление качеством: Настраиваемые параметры качества отрисовки
  • Слои canvas: Задайте THPDFEmfOptions.CanvasOver когда существующий контент страницы должен рисоваться поверх проигранного Canvas-контента метафайла
  • Управление перерисовкой: Оставьте THPDFEmfOptions.Redraw включённым для умолчального временного пути перерисовки или выключите, чтобы разбирать исходный метафайл напрямую
  • Клиппинг по кадру: Задайте THPDFEmfOptions.UseFrame, чтобы обрезать вывод EMF по кадру заголовка, когда импортируемые метафайлы полагаются на границы кадра
  • Паттерны hatch-кистей: EMF/WMF hatch-кисти отображаются в tiling-паттерны PDF, так что импортированные рисунки сохраняют текстуру заливки
  • Диагностика null-объектов: Держите null-перо и null-кисть невидимыми по умолчанию или задайте THPDFEmfOptions.ShowNullPen и THPDFEmfOptions.ShowNullBrush, когда диагностике нужно сделать эти пути или заливки видимыми

Оптимизации производительности

  • Экономная по памяти обработка больших метафайлов
  • Оптимизированный разбор EMF-записей
  • Интеллектуальное кэширование повторяющихся элементов
  • Уменьшенный след памяти при конверсии

Совместимость и стандарты

  • Поддержка Windows EMF 1.0 и Enhanced EMF
  • Обратная совместимость с Windows Metafile (WMF)
  • Кроссплатформенная согласованность отрисовки
  • Соответствие стандартам векторной графики PDF

Поиск неисправностей

Типичные проблемы и решения:

  • Большие метафайлы: Для очень больших или сложных метафайлов используйте битмап-отрисовку
  • Отрисовка текста: Убедитесь, что шрифты доступны в целевой системе
  • Сложная графика: Для лучшего качества рассмотрите прямую отрисовку EMF
  • Проблемы позиционирования: Для точного размещения используйте своё позиционирование

См. также