Как извлечь метафайл из TOleContainer? - PullRequest
4 голосов
/ 19 мая 2010

У меня есть приложение Delphi (BDS 2006) с управлением TOleContainer. Внутри него есть объект OLE, формула MS Equation (имя 'Equation.3') из MS Office 2003.

Как извлечь векторный метафайл из изображения формулы, чтобы вставить его в веб-страницу или другой документ без поддержки OLE?

TOleContainer содержит только объекты Equation.3, других возможностей нет. Я пытался использовать метод .Copy, чтобы сделать это через буфер обмена, но он скопировал пустое изображение.

Ответы [ 2 ]

4 голосов
/ 17 ноября 2010

OLE-контейнер имеет базовый интерфейс IOLEObject, к которому вы можете получить доступ. Вы можете передать это в функцию OLEDraw со своим собственным холстом. Вы можете использовать растровое изображение или холст метафайла, а затем сохранить изображение в нужном вам формате.

OleDraw (OleContainer.OleObjectInterface, DVASPECT_CONTENT, Bmp.Canvas.Handle, R);


{
  DrawOleOnBmp
  ---------------------------------------------------------------------------
  Take a OleObject and draw it to a bitmap canvas.  The bitmap will be sized
  to match the normal size of the OLE Object.
}
procedure DrawOleOnBmp(Ole: IOleObject; Bmp: TBitmap);
var
  ViewObject2: IViewObject2;
  ViewSize: TPoint;
  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);

    OleDraw(Ole, DVASPECT_CONTENT, Bmp.Canvas.Handle, R);
  end
  else
  begin
    raise Exception.Create('Could not get the IViewObject2 interfact on the OleObject');
  end;

end;

3 голосов
/ 19 мая 2010

Когда вы используете метод SaveAsDocument вашего OleContainer, создается составной документ. Этот документ будет содержать IStream с именем # 2OlePress000 (# 2 - это значение байта 2). Содержимое этого потока является кэшированным представлением уравнения и используется для его отображения на компьютерах, на которых не установлен редактор уравнений.

Если вам известен формат этого потока, возможно, вы сможете использовать его для создания изображения для показа на веб-странице.

...