Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Bild aus RTF-Text extrahieren (https://www.delphipraxis.net/205075-bild-aus-rtf-text-extrahieren.html)

skoschke 29. Jul 2020 12:52

Bild aus RTF-Text extrahieren
 
Hallo,

hat jemand einen Ansatz, wie man ein Bild aus einem RTF-String extrahieren kann?

Der sieht in etwa (gekürzt) so aus:
Delphi-Quellcode:
{\rtf1\ansi \deff0{\fonttbl{\f0\fswiss Arial;}}{\colortbl;\red0\green0\blue0;\red255\green255\blue255;}\deftab1134\plain \f0 \fs20 \pard\qr \ri50  {\pict\wmetafile8\picw5508\pich10399\picwgoal3120\pichgoal5895\picscalex77\picscaley77 010009000003de60120000009ff700000000050000000701030000009ff7000040092000cc00000000004000840200000000280000009402000040000000010018000000000000ef010000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff.......
.......fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000}}
Danke
Ciao
Stefan

Rollo62 29. Jul 2020 13:21

AW: Bild aus RTF-Text extrahieren
 
Vielleicht ist das interessant ?
https://www.codeproject.com/Articles...-RTF-Converter

skoschke 29. Jul 2020 13:22

AW: Bild aus RTF-Text extrahieren
 
Danke für den Hinweis, bin schon am Laden...

... Schade, damit kann ich als "DelpiUser" leider absolut nichts anfangen!

Ciao
Stefan

KodeZwerg 29. Jul 2020 13:32

AW: Bild aus RTF-Text extrahieren
 
Vielleicht können das die WPCubed Komponenten? Sind ja Profi's was Pdf/Rtf und so angeht.
Per Hand.... hmmmm.... Tags auslesen und den Inhalt Binär speichern, was da rauskommt weiß ich nicht aber bin gespannt ;)

Redeemer 29. Jul 2020 14:06

AW: Bild aus RTF-Text extrahieren
 
Na ja, das ist ein Hex-String. Den kann man in der Datei suchen und dann das Hex umwandeln und in einen Stream schreiben.

TurboMagic 29. Jul 2020 14:35

AW: Bild aus RTF-Text extrahieren
 
Wenn ich den Code der RTF richtig interpretiere, muss man dann den generierten Stream den man wie von meinem "Vorposter"
beschrieben erzeugt hat (Hex nach Int geht übrigends mittels StrToInt('0x' + mystring)) als WMF Grafikformat behandeln.
Ich schließe das aus dem "wmetafile" Tag im Datenstrom.

jziersch 30. Jul 2020 07:37

AW: Bild aus RTF-Text extrahieren
 
Hallo Stefan,

ich habe Deine Testdaten mittels folgendem code (und WPTools) extrahiert

Code:
procedure TForm6.ExtractButtonClick(Sender: TObject);
var wp : TWPCustomRTFEdit; // uses WPCtrMemo - WPTools
    i : Integer;
begin
   wp := TWPCustomRTFEdit.CreateDynamic;
   try
      if OpenDialog1.Execute then
      begin
        wp.LoadFromFile(OpenDialog1.FileName);
        for i := 0 to wp.TextObjects.ObjCount-1 do      
           if wp.TextObjects.ObjList[i].IsImage then          
              wp.TextObjects.ObjList[i].ObjRef.SaveToFile(
                   Format('%sembedded_img_%d.%s',
                      [ExtractFilePath(OpenDialog1.FileName), i,
                        wp.TextObjects.ObjList[i].ObjRef.FileExtension] ));                
      end;
   finally
     wp.Free;
   end;
end;
Es wird ein WMF geschrieben mit der Adresse in der linken oberen Ecke.
Die Einbettung mittels \pict\wmetafile8 ist reichlich altmodisch und wird glücklicherweise heute nicht oft genutzt.

Die Anzeige in MS Word entspricht aber der des Metafiles (also winzig klein).

Das erzeugte WMF kann in WPTools eingefügt werden.

mjustin 30. Jul 2020 13:39

AW: Bild aus RTF-Text extrahieren
 
Die Idee mit der Suche nach \pict ... ist ganz ok. Neben WMF sind allerdings auch z.B. PNG oder JPG als Dateiformat möglich (siehe RTF Spezifikation).

skoschke 30. Jul 2020 14:15

AW: Bild aus RTF-Text extrahieren
 
Ich habe jetzt manuell aus dem RTF-String das Bild (ich bekomme hier immer \wmetafile8 ) herausgezogen und in eine Datei geschrieben (Test.wmf).

Diese lässt sich ohne Probleme mit dem Microsoft Office Picture Manager öffnen und anzeigen, daher gehe ich davon aus dass das erst mal korrekt ist.

Nun versuche ich, diese Datei in ein TMetaFile zu laden
Delphi-Quellcode:
 
  Metafile := TMetaFile.Create;
  MetaFile.LoadFromFile(fn);
und erhalte einen Laufzeitfehler: "Metadatei ist ungültig"

Die gleiche Datei habe ich auf einem Onlineportal in JPEG konvertieren lassen und dies ist ohne Fehler durchgelaufen.

Nun bin ich mit meinem Latein am Ende, hat jemand eine Idee?

Ciao
Stefan

mjustin 30. Jul 2020 14:38

AW: Bild aus RTF-Text extrahieren
 
Zitat:

Zitat von skoschke (Beitrag 1470818)
und erhalte einen Laufzeitfehler: "Metadatei ist ungültig"

Könnte an einem Headerfehler liegen. Ich erinnere mich dunkel an ein entsprechendes Problem mit in RTF eingebetteten WMF's. Enthält die Datei einen WMF Header?

jziersch 30. Jul 2020 14:51

AW: Bild aus RTF-Text extrahieren
 
Dem wmetafile8 typ in RTF fehlt der metafile header. Es wird daher mit SetWinMetaFileBits geladen.

Von WPTools (das Dir ja vorliegt) wird er als typ wpreadPictWMetafile geladen.

Das passiert dann in TWPOCustomImage.LoadMetafileStream

Ändere einfach mal den code

if WMetafileType = 8 then
lpmfp.mm := 8
else lpmfp.mm := 1; // was: WMetafileType;

in

if WMetafileType = 8 then
lpmfp.mm := 1
else lpmfp.mm := 1; // was: WMetafileType;

Das macht womöglich den entscheidenden Unterschied.
Anscheinend wurde die Metadatei inkorrekterweise als Typ 8 eingebettet, anstatt Typ 1, den andere RTF Leser zeigen ja auch eine Miniatur an.

skoschke 31. Jul 2020 12:44

AW: Bild aus RTF-Text extrahieren
 
Danke, aber leider bringt dies keinen Erfolg :-(

Ich denke da wird das uralte TX-Control (über 20 Jahre alt) wohl Mist machen beim Export als RTF.

Und mit diesem RTF muss ich nun klar kommen...

Ich habe den Inhalt des /Pict Datenabschnittes in eine Datei geschrieben, welche vom Microsoft Office Picture Manager problemlos gelesen und angezeigt wird.
Ein Export dieser angezeigten Datei wieder als WMF ergibt absolut bytegleich die gleiche Datei, beginnend mit 01 00 09 00 00 03 DE 60 ... wobei ich die die ersten 4 Byte auch online in einigen Dukumentationen gefunden habe, kann also nicht so falsch sein?

Ich wollte nun aus diesem WMF-File ein BMP-File erzeugen, um dieses dann in eine Textbox zu laden, aber
Delphi-Quellcode:
   
var
MetaFile : TMetaFile;
begin
MetaFile.LoadFromFile(FileWmf);
bekomme ich "Metadatei ist ungültig"

Zitat:

Könnte an einem Headerfehler liegen. Ich erinnere mich dunkel an ein entsprechendes Problem mit in RTF eingebetteten WMF's. Enthält die Datei einen WMF Header?
Wie müsste der aussehen?

Ciao
Stefan

jziersch 31. Jul 2020 12:52

AW: Bild aus RTF-Text extrahieren
 
Nachdem ich nur die Anzeige in WPTools sowie diverse Wordprozessor Programme kenne, weis ich nicht wie wie das eigentlich aussehen soll. Soll es skaliert sein, oder das kleine logo oben links oder ... ?

Den code zu abspeichern einer validen WMF incl. Header hab ich bereits oben gepostet. WPTools ergänzt ja den header.

generic 31. Jul 2020 21:24

AW: Bild aus RTF-Text extrahieren
 
Die Bild kann unterschiedlich kodiert sein.
Code:
{\pict\wmetafile8\picw5508\pich10399\picwgoal3120\pichgoal5895\picscalex77\picscaley77
pict leitet das Bild ein.
Dann kommt das Bild-Format hier ist dann noch Bitmap oder PNG möglich. Die Steuerbefehle schau mal bitte in der Dokumentation zum Format nach.

Code:
{\pict\wmetafile8\picw5508\pich10399\picwgoal3120\pichgoal5895\picscalex77\picscaley77\bin
Hinten hinter kann noch \bin angehängt sein, dann kommen Binärdaten ansonsten sind die Hex-kodiert.

skoschke 4. Aug 2020 12:03

AW: Bild aus RTF-Text extrahieren
 
Zitat:

Den code zu abspeichern einer validen WMF incl. Header hab ich bereits oben gepostet.
den habe ich auch verwendet und bekomme damit WMF's welche ich weiterverwenden kann.
Die Größe der Bilder bekomme ich aus dem RTF aus "/picwgoal" und "/picscalex" bzw. "pichgoal" und "/picscaley" und kann damit das Bildchen wieder in der original gewünschten Größe einfügen.

Allerdings macht mir das WPRichText da noch ein Problem beim Speichern und wieder Laden, dann sind die Bilder weg oder in der falschen Größe.
Konvertiere ich aber esrt das WMF in BMP und lade dieses dann ins WPRichText, funktioniert das Speichern und wieder Laden wie gewünscht.
Deswegen hatte ich erst an der Korrektheit der exportierten WMF's gezweifelt!

Ciao
Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:08 Uhr.

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