From: "Boris Novgorodov" Newsgroups: borland.public.delphi.graphics Subject: Re: Get EMF Text Date: Sun, 29 Jun 2003 19:03:42 +0700 > I have a EMF file and want to get all text out of the file and convert it to > a String so that I can use it in a TMemo. procedure TForm1.Button1Click(Sender: TObject); var emf:TMetaFile; emc:TMetaFileCanvas; begin emf:=TMetaFile.Create; emc:=TMetaFileCanvas.Create(emf,0); emc.TextOut(0,0,'Aaaabbbb'); emc.Ellipse(10,10,200,100); emc.TextOut(100,90,'123 456 789'); emc.Free; emf.SaveToFile('e:\emf.emf'); Canvas.Draw(0,0,emf); emf.Free; end; function EnumProc(DC:HDC;lpHTable:PHANDLETABLE; EMFR:PENHMETARECORD; nObj,lpData:Integer):Integer;stdcall; var ws:WideString; rec:PEMRExtTextOut; r:Trect; p:Tpoint; begin if (EMFR.iType=EMR_EXTTEXTOUTW) then begin rec:=PEMRExtTextOut(EMFR); setlength(ws,rec.emrtext.nChars); p:=rec.emrtext.ptlReference; r:=rec.rclBounds; Form1.Memo1.Lines.Add(Format('BasePoint:%d:%d',[p.x,p.y])); Form1.Memo1.Lines.Add(Format('BoundsRect:%d:%d - %d:%d', [r.left,r.top,r.right,r.bottom])); Move(Pointer(2+ Cardinal(@rec.emrtext) + rec.emrtext.offString div 2)^, ws[1],Length(ws)*2); Form1.Memo1.Lines.Add('String: '+ws); if ws[1]='A' then SetTextColor(form1.canvas.Handle,clLime); end; PlayEnhMetafileRecord(Form1.Canvas.Handle,lpHTable^,emfr^,nobj); Result:=1; end; procedure TForm1.Button2Click(Sender: TObject); var emf:TMetaFile; r:Trect; begin refresh; emf:=TMetaFile.Create; emf.LoadFromFile('e:\emf.emf'); Canvas.Draw(0,0,emf); r:=Rect(0,0,1,1); EnumEnhMetaFile(0,emf.Handle, @EnumProc, nil, r); emf.free; end; procedure TForm1.Button3Click(Sender: TObject); var emf:TMetaFile; XF:TXForm; begin refresh; XF.eM11:=0.707; XF.eM12:=0.707; XF.eM21:=-0.707; XF.eM22:=0.707; XF.eDx:=100; XF.eDy:=100; emf:=TMetaFile.Create; emf.LoadFromFile('e:\emf.emf'); SetGraphicsMode(Canvas.Handle,GM_ADVANCED); SetWorldTransForm(Canvas.Handle,XF); Canvas.Draw(0,0,emf); emf.free; end; -- Regards Boris Novgorodov