AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kontextsensitive Hilfe aus Programm zu PDF

Ein Thema von TiGü · begonnen am 3. Nov 2015 · letzter Beitrag vom 4. Dez 2015
Antwort Antwort
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#1

AW: Kontextsensitive Hilfe aus Programm zu PDF

  Alt 3. Nov 2015, 17:43
Wenn ich mir das von Neutral General verlinkte PDF von Adobe so anschaue, müsste das mit Named Destinations machbar sein, ggf. in Verbindung mit Bookmarks/Lesezeichen. Ich würde auf jeden Fall davon Abstand nehmen, programmspezifische Parameter zu benutzen, also z.B. solche, die nur im Adobe Reader funktionieren, denn wer sagt denn, dass dieser in jedem Fall installiert und/oder das Standardprogramm für PDFs ist?

MfG Dalai
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.651 Beiträge
 
Delphi 12 Athens
 
#2

AW: Kontextsensitive Hilfe aus Programm zu PDF

  Alt 3. Nov 2015, 19:04
Wenn ich mir das von Neutral General verlinkte PDF von Adobe so anschaue, müsste das mit Named Destinations machbar sein
..

MfG Dalai
Ich habe für unsere Firma ein Programm geschrieben, womit man Named Destination erzeugen kann. Das sind sogenannten Ziele in einer PDF Datei.
Man nimmt einfach eine PDF Datei und die durchsuche ich nach bestimmten Merkmalen. Wenn ich ein solches Merkmal gefunden habe, mache ich ein "Ziel" draus und schon kann man dies von außen anspringen.
Geht ganz gut für unsere Steuerung, wenn man beispielsweise ein Hilfe integrieren will.
Gemacht alles mit quickpdf/ Kostet zwar einiges, ist aber jeden Cent wert.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Kontextsensitive Hilfe aus Programm zu PDF

  Alt 4. Nov 2015, 10:32
Wenn ich mir das von Neutral General verlinkte PDF von Adobe so anschaue, müsste das mit Named Destinations machbar sein, ggf. in Verbindung mit Bookmarks/Lesezeichen. Ich würde auf jeden Fall davon Abstand nehmen, programmspezifische Parameter zu benutzen, also z.B. solche, die nur im Adobe Reader funktionieren, denn wer sagt denn, dass dieser in jedem Fall installiert und/oder das Standardprogramm für PDFs ist?
Das mit den "Named Destinations" sieht interessant und auch praktikabel aus, gerade in Hinblick auf verschiedene PDF Reader.

Kann ich mir das vereinfacht so vorstellen, dass der Ersteller der PDF irgendwie zu den jeweiligen Themen eine "Named Destination" erstellt und ich dann per ShellExecute die PDF mit den dafür registrierten Programm öffne und durch den "Named Destinations"-Parameter springt das Ganze zur passenden Stelle?
Delphi-Quellcode:
ShellExecute(Application.Handle,
                 'open',
                 PChar('C:\TestPath\myfile.pdf#nameddest=custom1'),
                 nil, nil, SW_NORMAL)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#4

AW: Kontextsensitive Hilfe aus Programm zu PDF

  Alt 4. Nov 2015, 11:42
Kann ich mir das vereinfacht so vorstellen, dass der Ersteller der PDF irgendwie zu den jeweiligen Themen eine "Named Destination" erstellt und ich dann per ShellExecute die PDF mit den dafür registrierten Programm öffne und durch den "Named Destinations"-Parameter springt das Ganze zur passenden Stelle?
So stelle ich mir das ebenfalls vor. Wie aber die Named Destinations erstellt werden können, weiß ich mangels Erfahrung mit PDF leider nicht zu sagen. Eine kurze Suche gestern hat aber einige Ergebnisse zutage gefördert. Es kann sein, dass man diese Dinger nur mit Löhnware hinbekommt (weiß nicht, ob das ein (K.O.)Kriterium für das Vorhaben ist).

MfG Dalai
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Kontextsensitive Hilfe aus Programm zu PDF

  Alt 4. Nov 2015, 12:56
Es kann sein, dass man diese Dinger nur mit Löhnware hinbekommt (weiß nicht, ob das ein (K.O.)Kriterium für das Vorhaben ist).
Das würde gehen, weil es in der Doku-Abteilung eine Lizenz für den Adobe Acrobat gibt, mit dem bisher die PDFs erstellt und bearbeitet werden.
Ich halte mal Rücksprache und berichte dann.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Kontextsensitive Hilfe aus Programm zu PDF

  Alt 4. Dez 2015, 13:58
Heute endlich eine PDF mit Named Destinations von der Doku-Abeteilung bekommen.
Ich dachte ich bekomme es gar nicht hin, aber jetzt ist der Knoten geplatzt.
Also grundsätzlich gehts!

Der folgende Quellcode ist nicht schön, funktioniert aber soweit und sucht auch selbstständig den aktuell eingestellten PDF-Reader raus.
Getestet mit den neusten FoxIt- und Acrobat Reader.

Delphi-Quellcode:
uses
  System.Win.Registry, Winapi.ShellApi;

const
  NAMED_DESTINATION_PREFIX = '/A "nameddest=';
  REG_SHELL_OPEN_COMMAND = '\Shell\Open\Command';
  COMMAND_OPEN = 'open';

function GetAssociation(const DocFileName: string): string;
var
  FileExtension : string;
  FileClass: string;
  Reg: TRegistry;
begin
  Result := '';
  Reg := TRegistry.Create(KEY_EXECUTE);
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    FileClass := '';
    FileExtension := ExtractFileExt(DocFileName);
    if Reg.OpenKeyReadOnly(FileExtension) then
    begin
      FileClass := Reg.ReadString('');
      Reg.CloseKey;
    end;

    if FileClass <> 'then
    begin
      if Reg.OpenKeyReadOnly(FileClass + REG_SHELL_OPEN_COMMAND) then
      begin
        Result := Reg.ReadString('');
        Reg.CloseKey;
      end;
    end;
  finally
    Reg.Free;
  end;
end;

procedure DoOpenPDF(const PDFReader, FileName, NamedDestination: string);
var
  ExecuteResult: HINST;
  Parameters: string;
begin
  Parameters := NAMED_DESTINATION_PREFIX + NamedDestination + '" "' + FileName + '"';

  ExecuteResult := ShellExecute(
    Application.Handle,
    COMMAND_OPEN,
    PChar(PDFReader),
    PChar(Parameters),
    nil,
    SW_NORMAL
    );

  if ExecuteResult < 32 then
    RaiseLastOSError;
end;

procedure OpenPDF(const FileName: string; const NamedDestination: string = '');
var
  PDFReader: string;
begin
  PDFReader := GetAssociation('.pdf'); // 'FoxitReader.exe'; //'AcroRd32.exe';
  PDFReader := ExtractFileName(PDFReader);
  PDFReader := PDFReader.Replace('" "%1"', '', [rfReplaceAll, rfIgnoreCase]);

  DoOpenPDF(PDFReader, FileName, NamedDestination);
end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:26 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-2025 by Thomas Breitkreuz