Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz