Как извлечь векторный метафайл из объекта OLE для вставки в веб-страницу
Вопрос, поставленный перед разработчиками, использующими компоненты Delphi для работы с OLE-объектами, заключается в необходимости извлечения векторного метафайла из объекта OLE для последующей вставки в веб-страницу или другие документы, не поддерживающие OLE. Рассмотрим подробный процесс решения данной задачи.
Проблема и контекст
В вашем приложении Delphi (BDS 2006) используется компонент TOleContainer, в который включен OLE-объект — формула из MS Equation Editor (название 'Equation.3') из MS Office 2003. Необходимо извлечь векторный метафайл из изображения формулы для интеграции в веб-страницу или другой документ, который не поддерживает OLE.
Решение проблемы
Для извлечения метафайла из TOleContainer можно использовать функцию OleDraw, которая позволяет нарисовать OLE-объект на заданном холсте. В качестве холста может быть использован битмап или метафайл. Ниже приведен пример кода, который демонстрирует, как можно выполнить данную операцию на Delphi:
procedure DrawOleOnBmp(Ole: IOleObject; Bmp: TBitmap);
var
ViewObject2: IViewObject2;
ViewSize, AdjustedSize: TPoint;
DC: HDC;
R: TRect;
begin
if Succeeded(Ole.QueryInterface(IViewObject2, ViewObject2)) then
begin
ViewObject2.GetExtent(DVASPECT_CONTENT, -1, nil, ViewSize);
DC := GetDC(0);
AdjustedSize.X := MulDiv(ViewSize.X, GetDeviceCaps(DC, LOGPIXELSX), 2540);
AdjustedSize.Y := MulDiv(ViewSize.Y, GetDeviceCaps(DC, LOGPIXELSY), 2540);
ReleaseDC(0, DC);
Bmp.Height := AdjustedSize.Y;
Bmp.Width := AdjustedSize.X;
SetRect(R, 0, 0, Bmp.Width, Bmp.Height);
// Заливка холста белым цветом
Bmp.FillRect(0, 0, Bmp.Width, Bmp.Height, clWhite);
OleDraw(Ole, DVASPECT_CONTENT, Bmp.Canvas.Handle, R);
end
else
raise Exception.Create('Could not get the IViewObject2 interface on the OleObject');
end;
В этом коде используется интерфейс IViewObject2 для получения размеров объекта, а затем OleDraw для рисования объекта на холсте. Важно перед рисованием заполнить холст однородным цветом, например, белым, чтобы избежать наложения изображения на уже существующий фон.
Альтернативные подходы
В качестве альтернативного подхода можно использовать метод SaveAsDocument объекта TOleContainer, который создает сложный документ, содержащий поток данных с именем #2OlePress000. Этот поток может содержать кэшированное представление формулы, которое можно использовать для отображения на компьютерах, не имеющих установленный редактор формул.
Подтвержденный ответ
Использование функции OleDraw с битмапом или метафайлом для рисования объекта OLE является подтвержденным решением задачи. Этот метод позволяет извлечь изображение объекта, которое затем может быть использовано в веб-странице или других документах, не поддерживающих OLE.
Заключение
Извлечение векторного метафайла из объекта OLE с помощью Delphi требует понимания работы с интерфейсами OLE и использования функции OleDraw. Приведенный выше пример кода демонстрирует, как можно реализовать этот процесс. Следуя данной инструкции, вы сможете успешно вставить OLE-объект в веб-страницу или другой документ, не поддерживающий OLE, обеспечив при этом сохранение векторного качества изображения.
Описание контекста: Необходимо извлечь векторный метафайл из объекта OLE для интеграции в веб-страницу или другой документ, который не поддерживает OLE, используя компоненты Delphi и интерфейс OleDraw.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.