Datei-Vorschau
-
- 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
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
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: 173
- Registriert: Mo 20. Okt 2008, 20:50
- OS, Lazarus, FPC: macOS 10.4-14.1, Windows 2000-11, Raspbian (L 3.7.0, FPC 3.2.2)
- CPU-Target: PowerPC, Intel, ARM
- Wohnort: Hattingen, NRW
- Kontaktdaten:
Re: Datei-Vorschau
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.
Re: Datei-Vorschau
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:
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
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;
[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
-
- 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
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
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.
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);
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.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
- 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
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.
-
- 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
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.
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.
-
- 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
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.
-
- 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
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.
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.
-
- 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
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
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/