# Wie PDF in jar packen und drauf zugreifen?



## it-girl (1. Sep 2011)

Hallo zusammen,

ich habe ein Programm geschrieben, das bei Klick auf einen Button ein PDF öffnen soll. Im Eclipse funktioniert das auch wie es soll.
Jetzt habe ich das gesamte Projekt als Runnable Jar File exportiert und nun findet er das PDF nicht mehr und kann es nicht öffnen.
Habe schon versucht, das Jar-File mit WinRar zu öffnen und das PDF von Hand hineinzukopieren. Aber das hat auch nicht geklappt (also das Kopieren schon, nur finden tut er's trotzdem nicht).

Weiß jemand, wie ich das hinbekomme?

Danke schon mal 

LG
IT-girl


----------



## jgh (1. Sep 2011)

um dir helfen zu können, solltest du zumindest den Codeteil posten, wie du auf das pdf-File zugreifst...ansonsten ist es reine Raterei


----------



## it-girl (1. Sep 2011)

Klar, sorry, hab ich vergessen 
Hier ist er:

```
Process p = Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL Dokument.pdf);
```

Und das PDF liegt direkt im Projektordner, falls das wichtig ist...


----------



## faetzminator (1. Sep 2011)

Das PDF kann nicht direkt aus dem Jar geöffnet werden. Es muss irgendwo ausserhalb liegen.


----------



## Deros (1. Sep 2011)

sowas dürfte eher funktionieren

```
InputStream is = this.getClass().getClassLoader().getResourceAsStream("doku.pdf");
```


----------



## it-girl (1. Sep 2011)

Mir kommt da grad so ne Idee... Wahrscheinlich ist sie aber total blöd...
Kann man das Jar-File des Programms mit dem PDF zusammen in ein anderes Runnable Jar File tun, welches dann das "Programm-Jar" aufruft?

Also mal als Ordnerstruktur dargestellt:

Jar1     (ruft Jar2 auf) 
  |- Jar2    (ruft PDF auf)
  |- PDF     

Geht sowas? 

@Deros: Wie verwende ich denn diese Zeile? Habe sie grade mal anstelle meiner geposteten eingefügt, aber es tut sich nichts... Und kann damit dann das PDF aus dem Jar heraus geöffnet werden?


----------



## Deros (1. Sep 2011)

damit kommst du überhaupt erstmal an das pdf ran. Dann kannst du es z.b. in den temp-ordner streamen und dort öffnen. viel mehr möglichkeiten bleiben da wohl nicht.


----------



## nillehammer (1. Sep 2011)

Wenn man die hier geposteten Codes zusammenkopiert, kann es klappen:

```
Process p = Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL Dokument.pdf");
```
Dieser Befehl erwartet das pdf als Datei. Ein pdf in einem jar ist aber keine Datei (noch nicht). Entweder Du benutzt eine Java Bibliothek, die mit InputStreams umgehen kann. Dann musst Du nur das machen, was Deros schon gepostet hat, also:

```
InputStream is = this.getClass().getClassLoader().getResourceAsStream("doku.pdf");
```
Falls Du Deinen Shell Befehl weiter benutzen willst, musst Du den Inhalt des Streams in eine temporäre Datei kopieren und dann damit Deinen Runtime-Befehl aufrufen.


----------



## it-girl (1. Sep 2011)

Deros hat gesagt.:


> damit kommst du überhaupt erstmal an das pdf ran. Dann kannst du es z.b. in den temp-ordner streamen und dort öffnen.


Meinst du, dass ich das PDF von Hand mit ins Jar packe und dann bei Programmstart das PDF von dort in den Temp-Ordner kopiere und da dann drauf zugreifen kann?
Wie kann ich das PDF denn in den temp-Ordner kopieren/verschieben/was auch immer?

Ich hab ehrlich gesagt nicht besonders viel Ahnung was das Öffnen, Verschieben oder Ausführen von Dateien/Programmen aus meinem Javacode heraus angeht. Die Zeile, mit der ich bis jetzt auf das PDF zugreife und es öffne, habe ich in irgendeinem Forum aufgeschnappt und das hat funktioniert (in Eclipse zumindest).

Ach ja, möchte noch jemand meine Idee kommentieren? Oder ist die soo blöd, dass man da besser gar nichts zu sagt und sie gaaanz schnell vergisst? 

LG


----------



## faetzminator (1. Sep 2011)

Wieso willst du das PDF daraus extrahieren, wenn du es zuerst von Hand in das Jar packst :bahnhof: ? Warum nicht einfach in den gleichen Ordner wie das Jar kippen?


----------



## jgh (1. Sep 2011)

ich mache das mir relativ einfach...auch wenn die Experten hier der Meinung sind, dass man das so nicht macht, aber es funktioniert immer 

in dem Projekt lege ich mir entsprechende Ordner an: Bspw: pics, config, docs etc.
diese kopiere ich mir händisch aus dem Workspace und packe sie auf die gleiche Ebene wie das runnable jar und das gesamte Projekt wird dann noch in einen entsprechend benamten Ordner gepackt.
Dann kann man mit bspw. wie folgt darauf zugreifen:


```
Desktop d = Desktop.getDesktop();
			d.open(new File("docs/Dokument.pdf"));
```

als anhang mal, wie ich dann sowas ausliefern würde...entsprechende Ordner für pictures, configs etc mal weggelassen.


----------



## faetzminator (1. Sep 2011)

@jgh:
wieso sollte das nicht ok sein? Würde ich auch so machen...


----------



## it-girl (1. Sep 2011)

faetzminator hat gesagt.:


> Wieso willst du das PDF daraus extrahieren, wenn du es zuerst von Hand in das Jar packst :bahnhof: ? Warum nicht einfach in den gleichen Ordner wie das Jar kippen?


Weil ich das Programm bzw das Jar später an andere Leute weitergeben will und da finde ich es besser, wenn alles zusammen ist, also alles in einem Runnable Jar. Damit man nicht drauf achten muss, ob nun das PDF im richtigen Ordner liegt oder nicht, und trotzdem alles funktioniert.
Und einen Ordner als "Programm" weiterzugeben ist doch irgendwie.. naja, unprofessionell oder? Deshalb suche ich nun eine elegante Lösung dafür.


----------



## faetzminator (1. Sep 2011)

Dafür gibts ZIP u.ä.


----------



## jgh (1. Sep 2011)

weil ich dann -gerade bei bildern, oder anderen Ressourcen- *nicht *über 
	
	
	
	





```
this.getClass().getClassLoader().getResourceAsStream("doku.pdf")
```
 gehe und ich mir von einigen Experten anhören durfte, so macht man aber nicht...wenn ich mal Zeit habe, poste ich dir den Link und die übelsten Beschimpfungen :lol: dazu^^


----------



## it-girl (1. Sep 2011)

faetzminator hat gesagt.:


> Dafür gibts ZIP u.ä.


Aber das muss man erst entpacken.
Ich dachte eher an was, das man bekommt und dann nur einen Doppelklick draufsetzen muss und es läuft. Ist sowas denn möglich?


----------



## faetzminator (1. Sep 2011)

Da gibts mehrere Möglichkeiten. Z.B. diese: http://www.java-forum.org/spezialthemen/18384-6-varianten-java-programme-starten-jar-bat-exe-cd.html
Um was für ein OS gehts denn? Also wenn ein Windoofuser jeweils seinen sch**** Installer manuell downloaden, das Programm installieren, sich um die Updates kümmern ... muss - dann ist ein Zip wohl nicht zu viel verlangt :bae:


----------



## it-girl (1. Sep 2011)

Na gut, dann nehm ich das ZIP 
Ist wohl doch am einfachsten... und man kann ja nicht alles haben 
Dann müsste doch auch mein Code funktionieren oder? (
	
	
	
	





```
Process p = Runtime.getRuntime().exec( ... );
```
) Denn das PDF liegt ja dann im gleichen Ordner (egal welcher).

Edit: Habs grad probiert, es funktioniert 

Danke euch allen


----------



## jgh (1. Sep 2011)

it-girl hat gesagt.:


> ...
> Und einen Ordner als "Programm" weiterzugeben ist doch irgendwie.. naja, unprofessionell oder? Deshalb suche ich nun eine elegante Lösung dafür.



na ja, wenn du keinen Windows-Installer schreiben willst...ist das eigentlich die übliche Art SW anzubieten. siehe u.a eclipse...da bekommst du auch einen gezippten Ordner, wenn du den entpackst...liegt da genau 1 weiterer Ordner drin, der heißt...eclipse und in diesem Ordner sind weitere Ordner, sowie Dateien (u.a. auch eclipse.exe), aber gut...wenn das unprofessionell ist, dann bleib ich gerne weiter unprofessionell.


----------



## faetzminator (1. Sep 2011)

Ja, wenn das Jar von diesem Ordner her ausgeführt wird (bei einem Doppelklick). Wenn das Jar aber von einem anderen Ort (von einem anderen Programm) ausgeführt wird, dann gehts nicht mehr.


----------



## Michael... (1. Sep 2011)

jgh hat gesagt.:


> Dann kann man mit bspw. wie folgt darauf zugreifen:
> 
> ```
> Desktop d = Desktop.getDesktop();
> ...


Das kann man durchaus so machen und funktioniert sofern die Applikation direkt aus dem Verzeichnis in dem sich das Unterverzeichnis docs befindet gestartet wird - was ja bei Executable Jars der Fall ist.


			
				jgh hat gesagt.:
			
		

> weil ich dann -gerade bei bildern, oder anderen Ressourcen- nicht über this.getClass().getClassLoader().getResourceAsStream("doku.pdf") gehe


Wobei sowas sich bei Resourcen auf die man nur lesend zugreift anbietet. Es ist gekapselt, besteht keine Gefahr, dass irgendwas "verloren" geht oder unabsichtlich manipuliert wird und funktioniert garantiert immer.


----------



## it-girl (1. Sep 2011)

jgh hat gesagt.:


> na ja, wenn du keinen Windows-Installer schreiben willst...ist das eigentlich die übliche Art SW anzubieten. siehe u.a eclipse...da bekommst du auch einen gezippten Ordner, wenn du den entpackst...liegt da genau 1 weiterer Ordner drin, der heißt...eclipse und in diesem Ordner sind weitere Ordner, sowie Dateien (u.a. auch eclipse.exe), aber gut...wenn das unprofessionell ist, dann bleib ich gerne weiter unprofessionell.



Meine Aussage war aber, dass ich es unprofessionell finde, einen *normalen* Ordner weiterzugeben, nicht ein ZIP.


----------



## jgh (1. Sep 2011)

ob er gezippt, oder normal ist...lässt imho mehr Rückschlüsse darüber zu, wie das "Programm" verteilt wird, als über die Professionalität der SW...aber gut, ich habe keine Lust mehr^^
Du hast Recht, ich habe Ruhe...nichts für ungut


----------

