代码:procedure proPrintRTFWithBMP(strCaption,strPic,strTitle:string;rtf:TRichEdit); {strText为要打印的文本 strCaption为打印标题 strPic为图像文件目录 strTitle为要显示在图像右侧的图像标题} var FRTF:IRichEditOle; FOLE:IOLEObject; formatEtc:tagFORMATETC; FStorage :ISTORAGE; FClientSite:IOLECLIENTSITE; FLockBytes:ILockBytes; ReObject:TReObject; xt:TGuid; FTemp:IUnknown; strTemp:string; bCreateNew:boolean; ABMP:TBitmap; Ajpeg:TJpegImage; i:Longint; begin // rtfTemp:=TRichEdit.Create(frmPrintFrame); try { with rtfTemp do begin Parent := frmPrintFrame; width:=200; height:=200; visible:=false; Text := strText; end; } //图片文件不存在,直接打印文本并退出 if not fileexists(strPic)then begin PrintRichEdit(strCaption,rtf); exit; end; abmp:=TBitmap.Create; ajpeg:= TJpegImage.Create; try if ExtractFileExt(strPic)='.jpg' then begin bCreateNew:=true; ajpeg.LoadFromFile(strPic); abmp.Assign(ajpeg); strTemp:=ExtractFilePath(strPic)+'0099www.bmp'; abmp.SaveToFile(strTemp); for i:=1 to 30000 do application.ProcessMessages; end else strTemp:= strPic; finally abmp.Free; ajpeg.free; abmp:=nil; ajpeg:=nil; end; sendmessage(rtf.handle,EM_GETOLEINTERFACE,0,LongInt(@FRTF)); if not assigned(FRTF)then begin showmessage('Error to get Richedit OLE interface'); exit; end; //建立一个可以访问全局内存的Byte数组 FLockBytes //返回ILockBytes接口 if CreateILockBytesOnHGlobal(0,true,FLockBytes)<>S_OK then begin showmessage('Error to create Global Heap'); exit; end; //建立一个混合文档存取对象 if StgCreateDocfileOnILockBytes(FLockBytes,STGM_SHARE_EXCLUSIVE or STGM_CREATE or STGM_READWRITE,0,FStorage)<>S_OK then begin showmessage('Error to create storage'); exit; end;
{strText为要打印的文本 strCaption为打印标题 strPic为图像文件目录
strTitle为要显示在图像右侧的图像标题}
var
FRTF:IRichEditOle;
FOLE:IOLEObject;
formatEtc:tagFORMATETC;
FStorage :ISTORAGE;
FClientSite:IOLECLIENTSITE;
FLockBytes:ILockBytes;
ReObject:TReObject;
xt:TGuid;
FTemp:IUnknown;
strTemp:string;
bCreateNew:boolean;
ABMP:TBitmap;
Ajpeg:TJpegImage;
i:Longint;
begin
// rtfTemp:=TRichEdit.Create(frmPrintFrame);
try
{ with rtfTemp do
begin
Parent := frmPrintFrame;
width:=200;
height:=200;
visible:=false;
Text := strText;
end; } //图片文件不存在,直接打印文本并退出
if not fileexists(strPic)then
begin
PrintRichEdit(strCaption,rtf);
exit;
end; abmp:=TBitmap.Create;
ajpeg:= TJpegImage.Create;
try
if ExtractFileExt(strPic)='.jpg' then
begin
bCreateNew:=true;
ajpeg.LoadFromFile(strPic);
abmp.Assign(ajpeg);
strTemp:=ExtractFilePath(strPic)+'0099www.bmp';
abmp.SaveToFile(strTemp);
for i:=1 to 30000 do
application.ProcessMessages;
end
else
strTemp:= strPic;
finally
abmp.Free;
ajpeg.free;
abmp:=nil;
ajpeg:=nil;
end; sendmessage(rtf.handle,EM_GETOLEINTERFACE,0,LongInt(@FRTF));
if not assigned(FRTF)then
begin
showmessage('Error to get Richedit OLE interface');
exit;
end; //建立一个可以访问全局内存的Byte数组 FLockBytes
//返回ILockBytes接口
if CreateILockBytesOnHGlobal(0,true,FLockBytes)<>S_OK then
begin
showmessage('Error to create Global Heap');
exit;
end; //建立一个混合文档存取对象
if StgCreateDocfileOnILockBytes(FLockBytes,STGM_SHARE_EXCLUSIVE or
STGM_CREATE or STGM_READWRITE,0,FStorage)<>S_OK then
begin
showmessage('Error to create storage');
exit;
end;
formatEtc.cfFormat := 0;
FormatEtc.ptd := nil;
FormatEtc.dwAspect := DVASPECT_CONTENT;
FormatEtc.lindex := -1;
FormatEtc.tymed := TYMED_NULL; FRTF.GetClientSite(FClientSite); //从文件中创建一个OLE对象
if OleCreateFromFile(GUID_NULL,PWideChar(WideString(strTemp)),IID_IUnknown,0,@formatEtc,
FClientSite,FStorage,FOLE)<>S_OK then
begin
showmessage('Error');
exit;
end; //现在的FOLE还是一个IUnKnown接口,将其转换为一个 IOleObject接口
FTemp:=FOLE;
FTemp.QueryInterface(IID_IOleObject, FOle);
OleSetContainedObject(FOle, TRUE);
//step 2
reobject.cbStruct := sizeof(TReObject);
FOLE.GetUserClassID(xt);
ReObject.clsid := xt;
reobject.cp := ULong(REO_CP_SELECTION);
reobject.dvaspect := DVASPECT_CONTENT;
reobject.dwFlags := ULong(REO_RESIZABLE) or ULong(REO_BELOWBASELINE);
reobject.dwUser := 0;
reobject.poleobj := FOle;
reobject.polesite := FClientSite;
reobject.pstg := FStorage;
reobject.sizel.cx := 0;
reobject.sizel.cy := 0; FRTF.InsertObject(reobject); PrintRichEdit(strCaption,rtf);
finally
if bCreateNew then
Deletefile(strTemp);
FRTF:=nil;
FOLE:=nil;
end;
end;