我有一个带有TOleContainer控件的Delphi(BDS 2006)应用程序。它内部有一个OLE对象,来自MS Office 2003的MS Equation公式(名称'Equation.3')。
如何从公式图像中提取矢量图元文件,将其插入到网页或其他没有OLE支持的文档中?
TOleContainer里面只有'Equation.3'对象,没有其他可能性。 我试图使用.Copy方法通过剪贴板,但它复制了一个空图像。
答案 0 :(得分:4)
OLE容器具有您可以访问的基础IOLEObject接口。您可以使用自己的画布将其传递给OLEDraw函数。您可以使用Bitmap或Metafile画布,然后以您需要的格式保存图像。
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;
答案 1 :(得分:3)
使用OleContainer的SaveAsDocument方法时,会创建复合文档。该文档将包含一个名为#2OlePress000的IStream(#2是字节值2)。此流的内容是等式的缓存表示,用于在未安装公式编辑器的计算机上显示它。
如果您知道该流的格式,也许您可以使用它来创建要在网页上显示的图片。