PDF auf bestimmter Seite öffnen, Pfad zum Viewer nicht bekannt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

Hallo,

ich habe folgendes Problem:
Ich habe ein Programm erstellt, welches auf mehreren Rechnern eingesetzt wird.
Innerhalb einer GUI existiert ein Button, mit dessen Hilfe eine PDF-Seite auf einer bestimmten Seite geöffnet wird.
Zuvor wird im Code nach der Datei "AcroRd32.exe" gesucht, da ich davon ausgegengen bin, dass jeder den Adobe Reader auf seinem Rechnet hat und nutzt.

Nun dürfen einige der PCs nicht mehr den Adobe-Reader verwenden, sondern einen anderen.

Wie finde ich nun den Pfad zu dem in Windows eingestellten Standardprogramm zum Öffnen von PDF-Dateien?
Oder habt ihr noch eine andere Idee?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das "start" Kommando unter Windows sollte das normalerweise von alleine erledigen. Oder du schaust mal in Richtung DDE, und wie man das von Python aus nutzt. Ob allerdings alle PDF-Viewer die gleiche Art benutzen, nicht nur einen Datei zu oeffnen, sondern dann auch noch gleich zu einer bestimmten Seite zu springen - das kann ich schwer beurteilen.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@Patrick1990: Da alle modernen Browser auch PDF-Dateien anzeigen können, könnte man auch einen Browser mittels des `webbrowser`-Moduls starten und ein `#page=x` an die `file://`-URL hängen. Zumindest Firefox und Chromium springen damit zur richtigen Seite. Bei anderen Browsern müsstest du das ausprobieren.
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

Vielen Dank, das werde ich mal versuchen.

Habs nun versucht, jedoch öffnen sich die Seiten dann im PDF-Viewer und nicht im Browser.
Wenn ich die Zeile

Code: Alles auswählen

file:///C:/.../data.pdf#page=2
in den Browser kopiere funktioniert es allerdings.

Der Code ist einfach gehalten:

Code: Alles auswählen

import Webbrowser
webbrowser.open_new_tab('file:///C:/.../data.pdf#page=2')
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@Patrick1990: Hmm, schade. Ich hatte das nicht getestet. Anscheinend sucht das `webbrowser`-Modul nicht nur Browser ab, sondern auch noch (betriebssystemabhängige) Standardprogramme, unter Linux u. a. `xdg-open` und unter Windows `os.startfile`.

Man könnte jetzt das `webbrowser`-Modul monkeypatchen, dass nur noch Browser abgesucht werden, aber so richtig schön wäre das nicht. Beispielsweise die ungewollten Einträge aus `webbrowser._tryorder` entfernen. Hat halt das Problem, dass das einfach kaputt gehen kann, wenn sich das Modul (bzw. die Python-Version) ändert. Oder man liefert einfach eine angepasste Version des Moduls mit dem eigenen Programm mit, bei der die ungewollte Programme entfernt wurden.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Möglicherweise hast du selber schon die Lösung gefunden, hier mal was ich so für mich heraus gefunden habe.
Egal ob unter Win10 1803 oder Win8.1 bekomme ich nur jeweils 2 Handler

Code: Alles auswählen

>>> import webbrowser

>>> webbrowser._browsers
{'windows-default': [<class 'webbrowser.WindowsDefault'>, None], 'c:\\program files\\internet explorer\\iexplore.exe': [None, <webbrowser.BackgroundBrowser object at 0x000000F2F2806048>]}

>>> webbrowser._tryorder
['windows-default', 'C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE']
>>> 
geliefert, obgleich auf beiden OS noch Firefox und Chrome und unter Win10 sogar noch Edge installiert sind.

Wenn man dann webbrowser.open( file adresse ) aufruft, wird der default handler für .pdf Dateien gestartet, also z.B. der PDF-Viewer.
Eine Möglichkeit wäre also, als Windows Defaulthandler für .PDF Dateien den gewünschten Browser zu konfigurieren.

Man kann jedoch auch die fehlenden Browser registrieren:

Code: Alles auswählen

>>> ffox_path = "C:\\Program Files\\Mozilla Firefox\\firefox.exe"
>>> webbrowser.register('firefox', None, webbrowser.BackgroundBrowser(ffox_path), 1)
>>> ffox= webbrowser.get('firefox')
>>> ffox.open("file:///D://datei.pdf#page=3")

>>> chrome_path = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
>>> webbrowser.register('chrome', None, webbrowser.BackgroundBrowser(chrome_path), 1)
>>> chrome = webbrowser.get('chrome')
>>> chrome.open("file:///D://datei.pdf#page=3")

>>> 
Der Firefox öffnet bei mir das PDF und springt auch zur angegebenen Seite.

Beim Chrome muss das Öffnen im Browser aktiviert sein,
siehe dazu https://support.google.com/chrome/answer/6213030?hl=de
Leider springt der Chrome nicht an die angegebene Seite.

Ich würde mich freuen, wenn dir das weiterhilft.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
MychaelE
User
Beiträge: 1
Registriert: Samstag 5. Dezember 2020, 18:21

narpfel hat geschrieben: Mittwoch 6. Juni 2018, 14:12 @Patrick1990: Da alle modernen Browser auch PDF-Dateien anzeigen können, könnte man auch einen Browser mittels des `webbrowser`-Moduls starten und ein `#page=x` an die `file://`-URL hängen. Zumindest Firefox und Chromium springen damit zur richtigen Seite. Bei anderen Browsern müsstest du das ausprobieren.
Hey Patrick1990,

ich lese gern mal Zeitschriften im PDF-Format im Chrome-Browser...
Jedesmal, wenn ich den Link (natürlich bequem in den Lesezeichen gespeichert) anklicke,
öffnet sich die Datei auf der Ersten Seite... *ätz* *kotz*
Es müßte doch möglich sein, irgendwie direkt auf die richtige Seite zu kommen... *seufz*
Ich, also, die Frage bei Google eingegeben und siehe da - direkt die perfekte Lösung gefunden!!!
Normalerweise schreib ich, wenn überhaupt, nur 'n Danke, oder so... aber diesmal
mußte ich mehr schreiben. Das Problem hat mich schon länger genervt und ich bin super happy
so eine einfache und perfekt passende Lösung gefunden zu haben.
Also, vielen Dank! Super!!

Mychael
Antworten