![]() |
Je Seite ein Bild in RTF Datei darstellen
Liste der Anhänge anzeigen (Anzahl: 1)
Wie kann ich mit Delphi eine RTF-Datei erstellen, die 3 Seiten hat und auf jeder dieser Seiten ein Bild ist. Die Bilder sollen in einem Positionsrahmen eingefügt sein. Das ganze erzeuge ich zur Laufzeit aus meinem Delphi-Program. Ich hab es auch schon fast hinbekommen. Bloss sind die 3 Bilder immer alle zusammen in einem Positionsrahmen auf einer Seite obwohl der RTF-Befehl \page für eine neue Seite im Code angegeben ist. Ich hänge die Datei mal an. Was muss ich da wie verändern, damit die 3 Bilder auch auf drei Seiten sind? Das ganze soll im OpenOffice und MS Word richtig angezeigt werden. Ihr könnt die RTF-Datei mit dem normalen Editor öffnen. Die RTF-Spec gitbs hier:
![]() Danke! |
DP-Maintenance
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Wie kann ich mit Delphi ... -> Delphi-Frage. ;) |
Re: Je Seite ein Bild in RTF Datei darstellen
*push* Hat keiner eine Idee?
|
Re: Je Seite ein Bild in RTF Datei darstellen
Ich hab mal in nem alten Projekt gekramt. Da habe ich noch RTF direkt in ein Textfile geschrieben.
Schau dir das einfach mal an:
Delphi-Quellcode:
Datei ist ein TextFile, was so vorbereitet wurde (:
procedure TRTF.WritePictureFrame(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; jpg:=tJpegimage.Create; if lowercase(ExtractFileExt(PictureFile))='.bmp' then begin bmp:=tbitmap.Create; try bmp.LoadFromFile(Picturefile); except exit; end; 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; 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); inc(b); end; mem.Free; jpg.Free; 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; 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; 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,'}'); writeln(Datei,'\par\pard '); end; procedure TRTF.WriteMetaFilePicture(const Meta:TMetaFile;posx,posy,maxwidth,maxheight:integer); var b:^byte; data:string; Stream:TMemorystream; i,hoehe,breite,nbreite,nhoehe:integer; begin Stream:=tmemorystream.Create; Meta.SaveToStream(Stream); Stream.Seek(0,sofrombeginning); b:=Stream.Memory; data:=''; for i:=1 to Stream.Size do begin data:=data+inttohex(b^,2); inc(b); end; Stream.Free; nbreite:=Meta.Width; nhoehe:=Meta.Height; 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; 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; writeln(Datei,'\pard\pvmrg\phmrg\posx'+inttostr(posx)+'\posy'+inttostr(posy)+'\absw'+inttostr(nbreite)+'\absh'+inttostr(nhoehe)+'\dxfrtext80'); writeln(Datei,'{\pict\emfblip\picw'+inttostr(breite)+'\pich'+inttostr(hoehe)+'\picwgoal'+inttostr(nbreite)+'\pichgoal'+inttostr(nhoehe)); writeln(Datei,data,'}'); writeln(Datei,'\par\pard '); end;
Delphi-Quellcode:
Vergess dann das "}" am Ende nicht!
write(Datei,'{\rtf1 \ansi\ansicpg1252');
writeln(Datei,'\deff0{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}}'); writeln(Datei,'{\info{\title ',Titel,'}{\subject ',Inhalt,'}{\author ',Bearbeiter,'}{\company ', Firma,'}{\category Protokoll}{\comment Created by MusterMaus}{\doccomm '+messort+'}{\version1}{\creatim\yr', yearof(Zeit),'\mo',monthof(Zeit),'\dy',dayof(Zeit),'\hr',hourof(Zeit), '\min',minuteof(Zeit),'\sec',secondof(Zeit),'}}'); //die Infozeile kannst du weglassen writeln(Datei,'\paperw11907\paperh16840\margl1418\margr1418\margt1418\margb1134 '); writeln(Datei,'\viewkind1\viewzk2\uc1\pard '); Und für nen Seitenumbruch musst du mal in den ![]() Edit: Upps, du warst ja schon soweit |
Re: Je Seite ein Bild in RTF Datei darstellen
@sirius: Danke, aber den code kenne ich glaube ich schon aus der DP. Die Bilder sind ja schon im Positionsrahmen und werden auch angezeigt. Nur alle zusammen und auf einer Seite. In Dein Code erzeugt keinen Seitenumbruch. Die Positionsrahmen scheinen irgendwie nicht richtig abgeschlossen zu sein. Oder es könnte auch sein, dass wenn 3x die gleiche Rahmendefiniton hintereinander auftritt diese 3 Rahmen zu einem zusammmengefasst werden?!
|
Re: Je Seite ein Bild in RTF Datei darstellen
Liste der Anhänge anzeigen (Anzahl: 1)
So?
|
Re: Je Seite ein Bild in RTF Datei darstellen
@Kedariodakon: Danke für den Versuch: In Word sieht es ok aus. Aber nicht in OpenOffice. Dort sind Bild 1+2 zusammen in einem Rahmen auf Seite 1 und Bild 3 ist auf Seite 2. D.h. der Rahmen ist wohl nicht richtig beendet?! Die Anforderung ein Bild pro Seite ist also nicht erfüllt.
|
Re: Je Seite ein Bild in RTF Datei darstellen
Hallo,
dieser ![]() Ist aber schon etwas älter. Grüße Klaus |
Re: Je Seite ein Bild in RTF Datei darstellen
@Klaus01: Danke für die Mühe, aber der Thread den Du gefunden hat, ist für meine Fragestellung nicht relevant. Ich benötige nicht irgendwelche Delphi-Controls/Komponenten, die den Seitenumbruch evtl. nicht können. Ich benötige reinen RTF-Code, den jeder mit dem Notepad erstellen könnte. Wenn man es genau nimmt, hat meine Fragestellung überhaupt nichts mit Delphi zu tun.
|
Re: Je Seite ein Bild in RTF Datei darstellen
Liste der Anhänge anzeigen (Anzahl: 1)
Da habe ich Dich mißverstanden.
Die RTF Spec kennst Du schon? \page oder \pagebb funktionieren nicht? Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 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-2025 by Thomas Breitkreuz