Datei-Vorschau

Rund um die LCL und andere Komponenten
Antworten
MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Datei-Vorschau

Beitrag von MacWomble »

Gibt es eine Komponente/Lösung um eine Dateivorschau (Thumbnail) für verschiedene Dateiformate (Libreoffice, pdf, Grafik) zu realisieren?

Problem: Ich habe eine Datenbank welche auf Dateien verweist. Nun soll beim Anzeigen eines Datensatzes entsprechend eine Vorschau des Dokuments erscheinen (1. Seite reicht)

Alternativ: Eingebundene Anzeige von PDF-Dateien
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

jwdietrich
Beiträge: 167
Registriert: Mo 20. Okt 2008, 20:50
OS, Lazarus, FPC: macOS 10.4-13.4, Windows 2000-11, Raspbian (L 2.2.6, FPC 3.2.2)
CPU-Target: PowerPC, Intel, ARM
Wohnort: Hattingen, NRW
Kontaktdaten:

Re: Datei-Vorschau

Beitrag von jwdietrich »

Das würde mich auch interessieren. Bei bestimmten Formaten, z. B. Bildern, machen das die meisten Betriebssysteme automatisch. Es wäre aber schön, wenn es eine Komponente für beliebige Dateiformate (ggf. mit zu verlinkender Funktion, die die Voransicht ausführt) gäbe.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Datei-Vorschau

Beitrag von wp_xyz »

Eine Komponente gibt es dafür sicher nicht. Aber zumindest für OpenDocument-Dateien kann ich dir folgende Lösung anbieten: Diese Dateien sind umbenannte zip-Dateien, und zumindest die von LibreOffice/OpenOffice geschriebenen enthalten im Ordner "Thumbnails" ein eingebettetes png-Vorschaubild. Mit Anleihen bei fpspreadsheet kannst du dieses durch folgenden Code in ein TPicture laden. Du solltest allerdings noch den Fall abfangen, dass kein Thumbnail vorhanden ist - fpspreadsheet z.B. schreibt kein thumbnail in die Datei:

Code: Alles auswählen

uses
  zipper;
 
type
  TStreamUnzipper = class(TUnzipper)
  private
    FInputStream: TStream;
    FOutputStream: TStream;
    FSuccess: Boolean;
    procedure CloseInputStream(Sender: TObject; var AStream: TStream);
    procedure CreateStream(Sender: TObject; var AStream: TStream;
      AItem: TFullZipFileEntry);
    procedure DoneStream(Sender: TObject; var AStream: TStream;
      AItem: TFullZipFileEntry);
    procedure OpenInputStream(Sender: TObject; var AStream: TStream);
  public
    constructor Create(AInputStream: TStream);
    function UnzipFile(const AZippedFile: string; ADestStream: TStream): Boolean;
  end;
 
constructor TStreamUnzipper.Create(AInputStream: TStream);
begin
  inherited Create;
  OnCloseInputStream := @CloseInputStream;
  OnCreateStream := @CreateStream;
  OnDoneStream := @DoneStream;
  OnOpenInputStream := @OpenInputStream;
  FInputStream := AInputStream
end;
 
procedure TStreamUnzipper.CloseInputStream(Sender: TObject; var AStream: TStream);
begin
  AStream := nil;
end;
 
procedure TStreamUnzipper.CreateStream(Sender: TObject; var AStream: TStream;
  AItem: TFullZipFileEntry);
begin
  FSuccess := True;
  AStream := FOutputStream;
end;
 
procedure TStreamUnzipper.DoneStream(Sender: TObject; var AStream: TStream;
  AItem: TFullZipFileEntry);
begin
  AStream := nil;
end;
 
procedure TStreamUnzipper.OpenInputStream(Sender: TObject; var AStream: TStream);
begin
  AStream := FInputStream;
end;
 
function TStreamUnzipper.UnzipFile(const AZippedFile: string;
  ADestStream: TStream): Boolean;
begin
  FOutputStream := ADestStream;
  FSuccess := False;
  Files.Clear;
  Files.Add(AZippedFile);
  UnZipAllFiles;
  Result := FSuccess;
end;
 
// Dies ist die Haupt-Routine
procedure ExtractOpenDocumentThumbnail(AFileName: String; APic: TPicture);
var
  stream: TFileStream;
  memstream: TMemoryStream;
  unzip: TStreamUnzipper;
  fn: String;
  i: Integer;
begin
  stream := TFileStream.Create(AFileName, fmOpenRead + fmShareDenyNone);
  try
    unzip := TStreamUnzipper.Create(stream);
    try
      unzip.Examine;
      for i := 0 to unzip.Entries.Count-1 do begin
        fn := unzip.Entries.Entries[i].ArchiveFileName;
        if fn = 'Thumbnails/thumbnail.png' then begin
          memStream := TMemoryStream.Create;
          unzip.UnzipFile(fn, memStream);
          memstream.Position := 0;
          APic.LoadFromStream(memstream);
          memStream.Free;
          exit;
        end;
      end;
    finally
      unzip.Free;
    end;
  finally
    stream.Free;
  end;
end;


Bei jpeg- und, ich glaube, auch bei tif-Dateien ist ebenfalls ein Thumbnail eingebettet, man kann es durch Durchlaufen der internen Records finden. Oder verwende dExif von Gerry McGuire (z.B. http://read.pudn.com/downloads177/sourc ... .pas__.htm).

[EDIT]
Wenn du nur für Windows schreibst, kann dir auch der Code aus dem englischen Forum helfen - er kann Vorschaubilder für alle Dateitypen anzeigen:
http://forum.lazarus.freepascal.org/ind ... #msg186064

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Datei-Vorschau

Beitrag von MacWomble »

Danke schon mal für die Hinweise.

Ich schreibe 'auch' für Windows, aber vorrangig für Linux.

Im Moment habe ich eine Lösung über

Code: Alles auswählen

RunCommandInDir(Dateipfad, 'libreoffice "-env:UserInstallation=file:///tmp/LibO_Conversion" --headless --convert-to jpg ' + ODTDatei, Result)


eingebaut, was im Prinzip mit doc, docx, odt, pdf sehr gut funktioniert - allerdings nicht immer schnell genug. Mit Tabellendateien geht das leider auch nicht und eml und html sind nicht formatiert.

Ich habe mich nicht richtig ausgedrückt: Was ich möchte ist eine Vorschau innerhalb des Programms, diese kann theoretisch auch Bildschirmfüllend sein, weswegen die eingebundene png nicht ausreicht.
Dateianhänge
bsp.png
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Datei-Vorschau

Beitrag von MacWomble »

wenn ich bei convert-to nach png anstatt jpg konvertiere, gehen auch Calc-Dateien !
Zuletzt geändert von MacWomble am Mo 25. Apr 2016, 11:44, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Datei-Vorschau

Beitrag von MacWomble »

Ich habe ein weiteres Problem:

Ich habe nun für pdf-Dateien Imagemagick verwendet, da dieses um Welten schneller ist als libreoffilence.
Mit RunCommand('convert ' + PDFDatei + '[0] -resize 300 ' + PNGDatei, Result);
wird die erste Seite der PDF umgewandelt und als png gespeichert.
Im Dateimanager sieht alles richtig aus, jedoch fehlen die Farben irgendwie (Bild ist blass) wenn ich die png in das TImage lade.
Zuletzt geändert von MacWomble am Mo 25. Apr 2016, 13:17, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Datei-Vorschau

Beitrag von MacWomble »

Code: Alles auswählen

// es funktioniert wenn
        RunCommand('convert ' + ODTDatei + '[0] -thumnail 300 ' + ThumbDatei, Result);
// statt
        RunCommand('convert ' + ODTDatei + '[0] -resize 300 ' + ThumbDatei, Result);
// geschrieben wird !
 
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Datei-Vorschau

Beitrag von MacWomble »

Jetzt fehlen noch eml und html-Dateien - irgenwelche Tipps, wie man diese am besten in einer png darstellen kann?

Alternativ würde auch die Generierung in pdf sehr gut passen - bzw. wäre sogar der bessere Ansatz.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Datei-Vorschau

Beitrag von Christian »

Ich hab dafür fürs Promet ein Framework begonnen.
Ich nehm dafür Totalcommander/Doublecommander Lister Plusins die durch 2 Funktionen erweitert sind.
Eine um Bilder zu erzeugen und eine um Texte zu extrahieren.

https://github.com/cutec-chris/promet-e ... ce/plugins
Das sind die Plugins die bisher existieren.
PDF, Texte, Sourcen mach ich intern der Rest ist als Plugin realisiert
also DWG,verschiedene Mindmap Formate, oofile=Open Office, Vectorfile ist vieles was FPVectorial unterstützt (DXF,CDR,...),Winthumb extrahiert aus den Windows thumbs.db Files,Solidworks muss ich nicht erklären :)

Hier
https://github.com/cutec-chris/promet-b ... module.pas
Ist das Plugin Interface
Hier die Funktionsdeklarationen die die dlls bereitstellen
https://github.com/cutec-chris/promet-b ... otypes.pas
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten