Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Gibt es einen pdf viewer für D12? (https://www.delphipraxis.net/215153-gibt-es-einen-pdf-viewer-fuer-d12.html)

softtouch 18. Mai 2024 14:04

Gibt es einen pdf viewer für D12?
 
Ich suche seit geraumer Zeit nach einem pdf viewer für D12, einen der OHNE BROWSER oder externe dll's ein pdf anzeigen kann, nur unter Windows. Opensource sollte schon sein, nichts kommerzielles.
Alles was ich bisher gefunden habe, kostet entweder Geld/subscription oder kann pdf erzeugen, aber nicht anzeigen.

DaCoda 18. Mai 2024 14:49

AW: Gibt es einen pdf viewer für D12?
 
Schau dir mal https://github.com/tothpaul/PDFiumReader an.

Das sollte eventuell das sein, was du suchst.

dummzeuch 18. Mai 2024 15:00

AW: Gibt es einen pdf viewer für D12?
 
Zitat:

Zitat von DaCoda (Beitrag 1536824)
Schau dir mal https://github.com/tothpaul/PDFiumReader an.

Das sollte eventuell das sein, was du suchst.

GPL ? Vermutlich eher nicht.

softtouch 18. Mai 2024 16:13

AW: Gibt es einen pdf viewer für D12?
 
Zitat:

Zitat von DaCoda (Beitrag 1536824)
Schau dir mal https://github.com/tothpaul/PDFiumReader an.

Das sollte eventuell das sein, was du suchst.

Danke, aber das ist abhängig von einer dll, das wollte ich vermeiden.

tomkupitz 18. Mai 2024 17:09

AW: Gibt es einen pdf viewer für D12?
 
Du kannst mit GetPreviewHandlerCLSID auch einen PreviewHandler einbauen (siehe Bsp. in FFExpert auf meiner Seite https://www.screensoft.de).

Bernhard Geyer 20. Mai 2024 10:20

AW: Gibt es einen pdf viewer für D12?
 
Zitat:

Zitat von softtouch (Beitrag 1536830)
Zitat:

Zitat von DaCoda (Beitrag 1536824)
Schau dir mal https://github.com/tothpaul/PDFiumReader an.

Das sollte eventuell das sein, was du suchst.

Danke, aber das ist abhängig von einer dll, das wollte ich vermeiden.

Keine DLL? Kein Browser?
Alles in Delphi-Code?
Vergiss es. Dazu ist der Delphi-Markt zu klein, um so ein komplexes Format dauerhaft auf Basis von freiwilligen zu stemmen.
Wir hatten mal vor Jahren das PDF Toolkit im Einsatz (https://www.gnostice.com/PDFtoolkit_VCL.asp).
haben es aber mittlerweile wieder entfernt, da die Probleme damit mit Real-Life-PDF viel zu groß waren.

Wenn es nur Windows ist, dann nimmt man dafür den EdgeBrowser, welche das überall installierte Edge WebView Control nutzt.
Funktioniert, Gibt regelmäßig Updates/Fixes und ist mit einer 100 KB DLL im Anwendungsverzeichnis mit sehr kleinen Footprint verbunden.

BlueStarHH 20. Mai 2024 14:52

AW: Gibt es einen pdf viewer für D12?
 
Zitat:

Zitat von tomkupitz (Beitrag 1536833)
Du kannst mit GetPreviewHandlerCLSID auch einen PreviewHandler einbauen (siehe Bsp. in FFExpert auf meiner Seite https://www.screensoft.de).

Hast Du dafür einen Beispielcode?

Und womit hast Du Deine Hilfe (https://www.screensoft.de/help/Willkommen.html) erstellt? Das sieht übersichtlich und schön schlicht aus. Danke!

himitsu 20. Mai 2024 14:58

AW: Gibt es einen pdf viewer für D12?
 
Zitat:

<meta name="generator" content="HelpNDoc Standard Edition 7.4.0.390">
Bezüglich IPreviewHandler findet sich auch was im Forum.

tomkupitz 20. Mai 2024 15:59

AW: Gibt es einen pdf viewer für D12?
 
Hilfe ist mit HelpNDoc erstellt.

Hier ein Stück Code:

Code:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Winapi.ShlObj, System.Win.ComObj, Winapi.ActiveX, Winapi.PropSys, System.Win.Registry;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private

  public

  end;

  TDefaultPreview=class
  private
    FFileStream: TFileStream;
    FPreviewHandler: IPreviewHandler;
  public
    constructor Create;
    destructor Destroy; override;

    function LoadPreview(ParentControl: TWinControl; FileName: string): Boolean;
    procedure PaintPreview(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetPreviewHandlerCLSID(const AFileName: string): string;
var
  LRegistry: TRegistry;
  LKey: String;
begin
  LRegistry:=TRegistry.Create();
  Result:=EmptyStr;
  try
    LRegistry.RootKey:=HKEY_CLASSES_ROOT;
    LKey:=ExtractFileExt(AFileName) + '\shellex\{8895b1c6-b41f-4c1c-a562-0d564250836f}';
    if LRegistry.OpenKeyReadOnly(LKey) then begin
      Result:=LRegistry.ReadString('');
      LRegistry.CloseKey;
    end else begin
      LKey:='SystemFileAssociations\' + ExtractFileExt(AFileName) + '\shellex\{8895b1c6-b41f-4c1c-a562-0d564250836f}';
      if LRegistry.OpenKeyReadOnly(LKey) then begin
        Result:=LRegistry.ReadString('');
        LRegistry.CloseKey;
      end else begin
        LRegistry.RootKey:=HKEY_LOCAL_MACHINE;
        LKey:='\Software\Classes\' + ExtractFileExt(AFileName) + '\shellex\{8895b1c6-b41f-4c1c-a562-0d564250836f}';
        if LRegistry.OpenKeyReadOnly(LKey) then begin
          Result:=LRegistry.ReadString('');
          LRegistry.CloseKey;
        end else begin
          LKey:='\Software\Classes\SystemFileAssociations\' + ExtractFileExt(AFileName) +
            '\shellex\{8895b1c6-b41f-4c1c-a562-0d564250836f}';
          if LRegistry.OpenKeyReadOnly(LKey) then begin
            Result:=LRegistry.ReadString('');
            LRegistry.CloseKey;
          end;
        end;
      end;
    end;
  finally
    LRegistry.Free;
  end;
end;

//

constructor TDefaultPreview.Create;
begin
  inherited Create;

  FFileStream:=nil;
  FPreviewHandler:=nil;
end;

destructor TDefaultPreview.Destroy;
begin
  if Assigned(FPreviewHandler) then
  begin
    FPreviewHandler.Unload;
    FPreviewHandler:=nil;
  end;

  inherited Destroy;
end;

//

function TDefaultPreview.LoadPreview(ParentControl: TWinControl; FileName: string): Boolean;
const
  GUID_ISHELLITEM='{43826d1e-e718-42ee-bc55-a1e261c37bfe}';

var
  re: TRect;

  GUID: TGUID;
  GUIDStr: string;

 InitializeWithFile: IInitializeWithFile;
 InitializeWithStream: IInitializeWithStream;
 InitializeWithItem: IInitializeWithItem;
 PreviewHandlerVisuals: IPreviewHandlerVisuals;

  Stream: IStream;

  ShellItem: IShellItem;

  res: HRESULT;

begin
  result:=False;

  //

  if Assigned(FPreviewHandler) then
  begin
    FPreviewHandler.Unload;
    FPreviewHandler:=nil;
  end;

  //

  CoInitializeEx(nil, COINIT_APARTMENTTHREADED or COINIT_DISABLE_OLE1DDE);

  //

  GUIDStr:=GetPreviewHandlerCLSID(FileName);

  if GUIDStr='' then
    Exit;

  GUID:=StringToGUID(GUIDStr);

  CoCreateInstance(GUID, nil, CLSCTX_LOCAL_SERVER, IPreviewHandler, FPreviewHandler);

  if FPreviewHandler=nil then
  begin
    CoUninitialize;
    Exit;
  end;

  result:=True;

  if FPreviewHandler.QueryInterface(IInitializeWithStream, InitializeWithStream)=S_OK then
  begin
    FFileStream:=TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
    Stream:=TStreamAdapter.Create(FFileStream, soOwned) as IStream;

    res:=InitializeWithStream.Initialize(Stream, STGM_READ or STGM_FAILIFTHERE or STGM_DIRECT);

    if (Succeeded(res)) then
    begin
      re:=Form1.ClientRect;

      FPreviewHandler.SetWindow(Form1.Handle, re);

      FPreviewHandler.SetRect(re);
      FPreviewHandler.DoPreview;
      FPreviewHandler.SetFocus;

      CoUninitialize;
      Exit;
    end;
  end;

  if Assigned(FPreviewHandler) then
  begin
    FPreviewHandler.Unload;
    FPreviewHandler:=nil;
  end;

  CoUninitialize;
end;

//

procedure TDefaultPreview.PaintPreview(Sender: TObject);
var re: TRect;

begin
  if Assigned(FPreviewHandler) then
  begin
    re:=Form1.ClientRect;

    FPreviewHandler.SetRect(re);
    FPreviewHandler.DoPreview;
    FPreviewHandler.SetFocus;
  end;
end;

//

var
  dp: TDefaultPreview;

procedure TForm1.FormCreate(Sender: TObject);
begin
  dp:=TDefaultPreview.Create;
  dp.LoadPreview(Self, 'demo.pdf');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  dp.Free;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  dp.PaintPreview(Sender);
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 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 by Thomas Breitkreuz