![]() |
Canvas in ein RTF-Dokument speichern ?
Ich arbeite in meinen Projekten mit der Freeware Komponente TPagePrinter (Copyright ©1997 Bill Menees) um Listen und Dokumente als Vorschau anzuzeigen und zu drucken.
Nun möchte ich einige mit TPagePrinter erstellte Dokumente in Word weiterbearbeiten, resp. als E-Mail Anhang im RTF-Format versenden können. Hätte jemand ein Idee, wie ich den Canvas des TPagePrinter in ein RTF-Dokument bekomme ? Vielen Dank für eure Tips ! |
Re: Canvas in ein RTF-Dokument speichern ?
Canvas kannst Du bei Deiner Frage vergessen.
Schau Dir einmal eine RTF-Datei mit (z.B.) Notepad an; dann siehst Du deren Aufbau. Wenn eine Druck-Komponente eine RTF-Datei erstellen kann, dann muss sie einen Schritt zurückgehen: Genauso, wie sie Daten zur Druckvorschau (und zum Drucken) aufbereitet, benötigt sie einen völlig anders gearteten Algorithmus, um eine RTF-Struktur zu erstellen. Einen ähnlichen Weg müsstest Du gehen: Nimm die ursprünglichen Daten und mache daraus Absätze mit Absatzformatierung usw. Das Ergebnis kannst Du Dir in einem RTF-Feld anschauen (das bietet aber z.B. keinen Seitenumbruch oder Kopf- und Fußzeilen). Gruß Jürgen |
Re: Canvas in ein RTF-Dokument speichern ?
Ein RTF mit einem Bild drin zu verschicken ist nicht die feine Art...
Ich hab aus einem alten Projekt mal relevanten Code rausgesucht um das RTF händig zu erstellen. Vielleicht gibts auch einfacher Varianten. Hier die Funktion um aus einer BMP-Datei (du kannst ja das Canvas als Bitmap nehmen) ein RTF-Kompatibles Bild zu machen und in eine RTF-Datei zu schreiben
Delphi-Quellcode:
Wie du siehst, schreibt die Funktion gleich in ein textfile (Datei). Und diese Datei wird das RTF.
procedure TRTF.WritePictureFramepos(const PictureFile:string;posx,posy:integer;maxwidth:integer=0;maxheight:integer=0);
var i:integer; jpg:tjpegimage; bmp:tbitmap; hoehe,breite,nbreite,nhoehe:integer; mem:TMemorystream; data:string; b:^Byte; begin if length(picturefile)=0 then exit; //Bild aus Datei laden jpg:=tJpegimage.Create; if lowercase(ExtractFileExt(PictureFile))='.bmp' then begin bmp:=tbitmap.Create; try bmp.LoadFromFile(Picturefile); except exit; end; //aus bmp ein jpg machen jpg.Assign(bmp); bmp.Free; end else if (lowercase(ExtractFileExt(PictureFile))='.jpg')or (lowercase(ExtractFileExt(PictureFile))='.jpeg')or (lowercase(ExtractFileExt(PictureFile))='.jpe') then begin try jpg.LoadFromFile(pictureFile); except exit; end; end else exit; jpg.JPEGNeeded; hoehe:=jpg.Height*20; //Einheiten in TWIPS umrechnen breite:=jpg.Width*20; mem:=Tmemorystream.Create; jpg.SaveToStream(mem); mem.Seek(0,sofrombeginning); b:=mem.Memory; data:=''; for i:=1 to mem.Size do begin data:=data+inttohex(b^,2); //angaben RTF-Kompatibel machen -->Hex inc(b); end; mem.Free; jpg.Free; //Skalieren auf maxwidth und/oder maxheight nbreite:=breite; nhoehe:=hoehe; maxwidth:=maxwidth*20; maxheight:=maxheight*20; if (nbreite>maxwidth)and(maxwidth>0) then begin nhoehe:=round(nhoehe/(nbreite/maxwidth)); nbreite:=maxwidth; end; if (nhoehe>maxheight)and(maxheight>0) then begin nbreite:=round(nbreite/(nhoehe/maxheight)); nhoehe:=maxheight; end; //negative Positionswerte (von unteren/rechten seitenrand) umrechnen if posx<0 then begin inc(posx); posx:=9071+posx*20-nbreite; end else posx:=posx*20; if posy<0 then begin inc(posy); posy:=14288+posy*20-nhoehe; end else posy:=posy*20; //shape=True: Bild auf freie Position setzen if shape then begin writeln(datei,format('{\shp{\*\shpinst\shpleft%d\shptop%d\shpright%d\shpbottom%d',[posx,posy,posx+nbreite,posy+nhoehe]), '\shpbypara\shpwr3\shpwrk0{\sp{\sn shapeType}{\sv 75}}{\sp{\sn pib}{\sv'); end else if withpos then writeln(Datei,'\pard\pvmrg\phmrg\posx'+inttostr(posx)+'\posy'+inttostr(posy)+'\absw'+inttostr(nbreite)+'\absh'+inttostr(nhoehe)+'\dxfrtext80'); writeln(Datei,'{\pict\jpegblip\picw'+inttostr(breite)+'\pich'+inttostr(hoehe)+'\picwgoal'+inttostr(nbreite)+'\pichgoal'+inttostr(nhoehe)); writeln(Datei,data,'}'); if shape then writeln(Datei,'\par\pard }}}}') else writeln(Datei,'\par\pard '); end; Dazu gibts noch einen RTF-Header: Der könnte so aussehen (und muss am anfang der Datei stehen):
Delphi-Quellcode:
(Wenn du nur ein Bild reinlegen willst, ist min. die Farbtabelle für dich irrelevant)
write(Datei,'{\rtf1 \ansi\ansicpg1252');
writeln(Datei,'\deff0{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}}'); writeln(Datei,'{\colortbl;\red0\green0\blue0;\red210\green255\blue210;\red255\green255\blue210;\red255\green255\blue210;\red255\green210\blue210;\red255\green255\blue255;}'); writeln(Datei,'{\info{\title ',Titel,'}{\subject ',Inhalt,'}{\author ',Bearbeiter,'}{\company ', Firma,'}{\category Protokoll}{\comment Created by Maxi Musterfrau}{\doccomm '+messort+'}{\version1}{\creatim\yr', yearof(Zeit),'\mo',monthof(Zeit),'\dy',dayof(Zeit),'\hr',hourof(Zeit), '\min',minuteof(Zeit),'\sec',secondof(Zeit),'}}'); writeln(Datei,'\paperw11907\paperh16840\margl1418\margr1418\margt1418\margb1134 '); writeln(Datei,'\viewkind1\viewzk2\uc1\pard '); Davor und dahinter musst du natürlich noch die Datei anlegen und schließen:
Delphi-Quellcode:
Soviel zum Erstellen von RTF. Falls sonst kein anderer Tipp kommt mit einer tollen Komponente und du diesen, meinen, Teil umsetzen musst, kannst du gerne weiterfragen (ich weis, dass Kommentare nicht so meine Stärke sind :oops:)
system.rewrite(Datei);
... writeheader ... writepictureframpos ... write(Datei,'}'); //nicht vergessen system.close(Datei); Edit: Statt eines Jpegs kann man in RTF acuh EMF, PNG und noch andere direkt ablegen, falls dir das lieber ist. ![]() |
Re: Canvas in ein RTF-Dokument speichern ?
Hallo und vielen Dank für die Tips soweit.
Eigentlich muss es auch kein RFT-Format sein. Das wäre schön gewesen, um das Dokument (Rechnung o.ä.) in Word zu bearbeiten, muss aber nicht unbedingt sein. Es geht mir vielmehr um die Möglichkeit, das angezeigt Dokument (ist übrigens ein TMetafile.canvas) per E-Mail versenden zu können. Wenn ich den TMetafile.canvas (von der Komponente TPagePrinter) in eine WMF-Datei schreibe, wird leider nichts übernommen. Hier mein bisheriger Code zum Erstellen der WMF Datei : procedure TPrintForm.BitBtn1Click(Sender: TObject); var MTF:TMetaFile; MTFCanvas:TMetaFileCanvas; MyRect:TRect; begin MTF:=TMetaFile.create; try MyRect:=Prn.Canvas.ClipRect; MTF.Width:=MyRect.Right-MyRect.Left; MTF.Height:=MyRect.Bottom-MyRect.Top; MTFCanvas:=TMetaFileCanvas.Create(MTF,; MTFCanvas.CopyRect(MyRect,Prn.canvas,Myrect); MTF.SaveToFile(DataForm.ApDatabase.DataPath+'\PPP. WMF'); finally MTF.Free; end; // hier die weitere Prozedur zum mailen der Datei // end; Vielen Dank für weitere Tips. |
Re: Canvas in ein RTF-Dokument speichern ?
Sorry, hier nochmals der vollständige Code (wurde leider nicht ganz übernommen) :
procedure TPrintForm.BitBtn1Click(Sender: TObject); var MTF:TMetaFile; MTFCanvas:TMetaFileCanvas; MyRect:TRect; begin MTF:=TMetaFile.create; try MyRect:=Prn.Canvas.ClipRect; MTF.Width:=MyRect.Right-MyRect.Left; MTF.Height:=MyRect.Bottom-MyRect.Top; MTFCanvas:=TMetaFileCanvas.Create(MTF,0); MTFCanvas.CopyRect(MyRect,Prn.canvas,Myrect); MTF.SaveToFile(DataForm.ApDatabase.DataPath+'\PPP. WMF'); finally MTF.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz