|
Расширенная поддержка метафайлов 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
- Проблемы позиционирования: Для точного размещения используйте своё позиционирование
См. также
|