# PDF mit Lesezeichen (nameddest) öffnen



## meister-g (8. Apr 2010)

Hallo,

wieder einmal habe ich ein Problem, das vom Thema her eigentlich oft auftreten sollte, die Webrecherche allerdings gar nichts ergab.

Simple Aufgabe:
Ein PDF öffnen und zu öffnen und zu einem Lesezeichen (nameddest springen).
Kann wegen mir auch den Acrobat Reader erfordern, muss aber nicht. Plattformabhängigkeit bzw sauberer Code wäre wichtiger.

So etwas funktioniert auf meinem System, möchte ich aber natürlich vermeiden

```
Runtime.getRuntime().exec("cmd.exe /c start acrord32.exe /A \"page=2\" \"pfad\meinpdf.pdf\");
```

Das bringt auch nichts, weil ich keine Paramter übergeben kann und plattformabhängig:

```
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + path);
Runtime.getRuntime().exec("cmd.exe /c start " + path);
```

Das schreit doch nach der Desktop Klasse.
Desktop.open() habe ich wieder das Parameterproblem.


```
Desktop desktop = Desktop.getDesktop();
		try { 
			String path = file.toURI().toString + "#page=2";
			URI uri = new URI(path);
			desktop.browse(uri);

		} catch (Exception e) { e.printStackTrace();}
```

Das öffnet nicht wie in der JavaDoc beschrieben den Browser, aber wie den Standard-Reader bzw Acrobat. Das passt auch so.
Problem: Der Parameter kommt nicht an.
Gebe ich die gleiche url (z.B. uri.toString() in meinen Browser ein wird zu Seite 2 gesprungen (statt #page=2 soll es einmal #sprungmarke werden).
Ist das nicht sogar ein Bug der JVM oder vom Betriebssystem wenn die Parameter nicht weitergeleitet werden? 

Hinweise:
Dem Acrobat Reader kann ich sowohl als Paramteraufruf a la
acrobat.exe /A "page=2" "C:\meinpdf.pdf"
als auch als url ala
File://meinpfad/meinpdf.pdf#page=2
Parameter/Lesezeichen übergeben.

Jemand eine Idee?
Oder doch mit der ersten gelisteten Variante realisieren


----------



## hansmueller (9. Apr 2010)

Hallo,

ich habe mal zum Test eine pdf-Datei (lokal auf der Festplatte) mit Firefox über "Datei öffnen..." geöffnet.
Dann kam ein Fenster in dem nachgefragt wurde, ob er es mit dem Acobe Reader öffnen sollte oder die Datei speichern soll.
In dem Fenster stand nicht nur der Name der Datei, sondern auch der Speicherort.
Das Öffnen mit hat wunderbar geklappt und mir wurde die erste Seite des pdf-Dokumentes angezeigt.

Dann habe ich die pdf-URL in der Adressleiste von Firefox um den Zusatz "#page=2" ergänzt und auf Enter gedrückt.
Es kam wieder das oben beschriebene Fenster. (Exakt das Gleiche, mit dem gleichen Inhalt. Da stand nicht mit "#page=2".) Nach der Bestätigung, daß er es mir mit dem Reader öffnen sollte, wurde auch das Dokument geöffnet.
ABER nicht auf Seite 2, sonder wieder auf Seite 1.

Ich vermute, das es sich hierbei nicht um einen Bug der JVM handelt, sondern daß der Browser den Zusatz einfach wegläßt.
Wenn bei dir die Seite 2 angezeigt wird, dann könnte es daran liegen, daß dein Adobe Reader sich die Seite, die zuletzt angezeigt wurde gemerkt hat und das Dokument daher wieder an der gleichen Stelle öffnet.
Oder du benutzt einen Browser, der in der Lage ist so einen zusätzlichen Parameter zu übergeben.

Ich schätze mal, das du mit 

```
desktop.open(File file)
```
auch nicht weiterkommst, da man hier auch keine Parameter übergeben kann.

Ansonsten fällt mir dazu sonst nichts weiter ein. Sorry.

MfG
hansmueller


----------



## meister-g (22. Sep 2010)

Hi,

ich wollte dieses Thema noch einmal aufwärmen.
Die einzige funktionierende Lösung ist nicht nur hässlich, sondern Spuckt auch eine hässliche Fehlermeldung, wenn der AcrobatReader nicht installiert ist.

Nächst unschöne Variante wäre, dass ich ein externes Tool verwende. Konkret eine Windowsanwendung, da ich mit Delphi leicht ein Acrobar-Reader Plugin realisieren kann.


----------



## hansmueller (22. Sep 2010)

Hallo,

ich habe mal gelesen, daß es diverse Java-Bibliotheken gibt, mit denen man PDF auslesen und bearbeiten kann. Es sollte also auch möglich sein einen reinen Java-PDF-Reader zu erstellen. Diesen Java-PDF-Reader müßtest du dann "nur noch" in dein Programm integrieren.

Habe mal gegoogelt und "Apache PDFBox" gefunden.
Man müßte nur noch rausfinden, ob das Teil auch mit Lesezeichen umgehen kann.

Das dürfte wahrscheinlich die sauberste Lösung sein, aber auch die aufwendigste.

MfG
hansmueller


----------



## meister-g (22. Okt 2010)

ich habe in der doku nichts über nameddests gefunden.

https://pdf-renderer.dev.java.net/
wäre eine schnelle saubere alternative, allerdings kann ich hier nur seitenweise springen.
blöd, weil dann immer ein mapping der nameddests hinzugefügt werden muss (und man nur seitenauflösung hat).


----------



## domjoe (19. Jan 2012)

Hallo,

bin gerade am googeln und würde das Thema gerne noch einmal aufwärmen.
Wie sieht es denn aus, sich mit der Methode "FindExecutable" der "shell32" vorher den String zum Standardprogramm zu holen!
Ich selbst habe es leider noch nicht hinbekommen!

Grüße,

domjoe


----------



## b0312 (19. Jan 2012)

Also ich hab mal in der Schule an einem Projekt mit Java&PDF gearbeitet,
mit der iText API, damit wirst du sicher einiges machen können, wir haben damit PDFs signiert, die Keywords manipuliert etc. 

greeTz*
B0312


----------



## domjoe (19. Jan 2012)

Ja, ich kenne itext. Benutze es sogar in diesem Zusammenhang! Ich greife auf die Bookmarks zu, und suche nach einem String, dann wird mir ne HashMap zurück gegeben und ich kann auf die Seitenzahl zugreifen. Jetzt möchte ich diese Seite einfach nur noch öffnen!
In itext konnte ich aber auch keine Informationen zum öffnen eines PDFs finden!

Grüße,

Jörn


----------

