![]() |
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 |
Re: Je Seite ein Bild in RTF Datei darstellen
Liste der Anhänge anzeigen (Anzahl: 1)
Ok weiterer Versuch...
Irgendwie bekomm ich das mit den Frames nicht gebacken, ka wo da der Hund begraben ist, so ein rtf-Meister bin ich leider auch nicht :wink: Ich hoffe das angehangene hilft dir denoch weiter... |
Re: Je Seite ein Bild in RTF Datei darstellen
@Kedariodakon: Das sieht schonmal gut aus. Da Du jetzt die Frames rausgeworfen hast, hab ich jetzt nur das Problem, wie ich die Bildposition ändern kann. Beim Frame war das ja mit \posxN und \posyN möglich. Die Bilder sollen nämlich nicht oben links in der Ecke hängen, sondern sich an einer bestimmten X,Y-Position befinden.
|
Re: Je Seite ein Bild in RTF Datei darstellen
Liste der Anhänge anzeigen (Anzahl: 1)
:cry:
Irgendwie verhält sich Microsoft Office und Open Office kommischerweise anders... Die Frage nur, wer macht es richtig? Irgendwie haben beide ihre Maken... komischerweise bekomm ich die Frames bei Microsoft Office nicht positioniert, kann ich tun was ich will... Versuchs mal damit, dass tuts wenigstens bei Open Office... Nunja, wie gesagt, mit Frames hab ich soweit nie wirklich gearbeitet... |
Re: Je Seite ein Bild in RTF Datei darstellen
@Kedariodakon: Danke für Deine Mühe. Mir ist aufgefallen, dass in Word der Frame/Rahmen nicht angezeigt wird. Es könnte sein, dass er von MS Word nicht eingelesen wird, da er nicht richtig definiert ist. Deswegen kann man wohl auch nicht positionieren. Die neuste Word-Version zeigt die Frames blau gestrichelt mit einem Abstand von etwas 5 Pixeln zum Bild an, wenn ein Bild doppelt angeklickt wird. In Test3.rtf ist nichts davon zu sehen. Da hat das Bild selbst diese gestrichelte Markierung und es wird auch nicht die Frame-Toolbar sonder die Bild-Toolbar angezeigt. Muss man überhaupt ein Frame verwenden? Kann man das Bild nicht anders Positionieren?
|
Re: Je Seite ein Bild in RTF Datei darstellen
hmm nicht das ich wüste...
|
Re: Je Seite ein Bild in RTF Datei darstellen
Ich hab gerade gemerkt, dass Word in meiner Ausgangsdatei die Frames anzeigt. Damit ist bewiesen, dass Word Frames anzeigen kann. Nur leider sind dort ja alle Bilder in einem Frame...
|
Re: Je Seite ein Bild in RTF Datei darstellen
Hallo,
wenn ich in einem OpenOffice TextDokument ein Bild pro Seite (manueller Seitenumbruch, kein Rahmen) einfüge, den Text als RTF-Dokument speichere und ihn mit dem WordViewer öffne, dann erhalte ich genau das gewünschte Layout. Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 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