Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Je Seite ein Bild in RTF Datei darstellen (https://www.delphipraxis.net/102582-je-seite-ein-bild-rtf-datei-darstellen.html)

BlueStarHH 31. Okt 2007 12:41


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: http://www.biblioscape.com/rtf15_spec.htm
Danke!

DP-Maintenance 31. Okt 2007 18:49

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Wie kann ich mit Delphi ...
-> Delphi-Frage. ;)

BlueStarHH 1. Nov 2007 16:19

Re: Je Seite ein Bild in RTF Datei darstellen
 
*push* Hat keiner eine Idee?

sirius 1. Nov 2007 16:36

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:
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;
Datei ist ein TextFile, was so vorbereitet wurde (:
Delphi-Quellcode:
  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 ');
Vergess dann das "}" am Ende nicht!

Und für nen Seitenumbruch musst du mal in den Spec nachlesen. Ich glaube "/page" ist dann dein Freund.

Edit: Upps, du warst ja schon soweit

BlueStarHH 1. Nov 2007 16:46

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?!

Kedariodakon 5. Nov 2007 13:15

Re: Je Seite ein Bild in RTF Datei darstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
So?

BlueStarHH 5. Nov 2007 13:30

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.

Klaus01 5. Nov 2007 14:16

Re: Je Seite ein Bild in RTF Datei darstellen
 
Hallo,

dieser Thread dürfte Dir wenig Hoffnung machen - das ganze zum Laufen zu bringen.
Ist aber schon etwas älter.

Grüße
Klaus

BlueStarHH 5. Nov 2007 14:26

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.

Klaus01 5. Nov 2007 14:40

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

Kedariodakon 5. Nov 2007 14:52

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...

BlueStarHH 5. Nov 2007 15:01

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.

Kedariodakon 5. Nov 2007 15:41

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...

BlueStarHH 5. Nov 2007 16:09

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?

Kedariodakon 5. Nov 2007 16:15

Re: Je Seite ein Bild in RTF Datei darstellen
 
hmm nicht das ich wüste...

BlueStarHH 5. Nov 2007 16:22

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...

marabu 5. Nov 2007 16:26

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