PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Systemaufruf



blaurot
21-07-2006, 11:14
Hallo
ich möchte mit meinem java-programm aus windows heraus pdflatex aufrufen.
jetzt habe ich auch schon was programmiert, was natürlich nicht funktioniert :-(
die wenigen beispiele dazu, die ich im netz gefunden habe sind alle zu unix.
bevor ich mir weiter den kopf zerbreche: geht das mit windows überhaupt???
gruß katrin

nul
21-07-2006, 11:51
Zeig mal was du schon hast.

blaurot
21-07-2006, 12:20
hier mein programm:

import java.io.*;
public class Pdf {
static Runtime RT=null;
static Process PR=null;

public static void pdferstellen(){
RT=Runtime.getRuntime();
try{
PR=RT.exec("pdflatex test2.tex");
if(PR!=null){
System.out.println("PDF-Datei erstellt");

}
}
catch(java.io.IOException e){
System.out.println("Fehler:"+e.toString());
}
System.exit( 0 );
}
public static void main (String args[]){
pdferstellen();
}
}

bischi
21-07-2006, 16:28
Sieht nicht schlecht aus - wo liegt genau das Problem? (Fehlermeldungen,...)

MfG Bischi

peschmae
21-07-2006, 16:35
Mögliche Probleme die ich da sehe:
a) er findet pdflatex gar nicht -> absoluten Pfad verwenden oder besser den Ordner von pdflatex in PATH aufnehmen
b) er nimmt den String den du da übergibst - "pdflatex file.tex" - falsch auseinander (in Argumente und Programmname aufteilen). Das sollte hier noch kein Problem sein, könnte aber eins werden wenn du z.B. Dateinamen mit leerzeichen als argument übergibst.
c) Was bei mir mal war (recht merkwürdig) ist dass unter Windows das von Java ausgeführte Kommandozeilenprogramm (bei mir war das cdrecord) nur dann lief wenn ich andauernd die beiden Streams stdout und stderr auf denen cdrecord was ausgab auslas. Sonst blieb das Programm einfach stehen bzw. fing gar nicht erst richtig an.
Wobei ich jetzt mal behaupte das war ein recht fetter bug in java - eventuell ist das heutzutage nicht mehr so. Aber versuchs mal ;)

MfG Peschmä

blaurot
21-07-2006, 17:21
da die if-abfrage true ist(er gibt pdf-datei erstellt aus) , dachte ich er hätte was gemacht, aber er hat die pdf-datei nicht wirklich erstellt.
aus cmd heraus macht er es, das habe ich gerade getestet.
aber mit dem java-prog erhalte ich folgende log-file:
This is pdfeTeXk, Version 3.141592-1.11a-2.1 (Web2c 7.5.2) (format=pdflatex 2006.7.12) 21 JUL 2006 17:17
entering extended mode
%&-line parsing enabled.
(c:/Programme/TeXLive/texmf/web2c/cp8bit.tcx)
**test2.tex
(./test2.tex{c:/Programme/TeXLive/texmf-var/pdftex/config/pdftex.cfg
Error: pdflatex.exe (file c:/Programme/TeXLive/texmf-var/pdftex/config/pdftex.c
fg): fflush() failed
==> Fatal error occurred, the output PDF file is not finished!

dann trifft fall a) zu, oder?? wo kann ich das in die Path schreiben??
danke katrin

bischi
21-07-2006, 18:07
Das sieht eher nach nem Fehler in der .tex-Datei aus...

MfG Bischi

blaurot
21-07-2006, 18:40
wenn ich aber doch das ganze aus der cmd mache, erhalte ich eine pdf-datei und folgende log.
gruß katrin

bischi
21-07-2006, 18:47
Und wenn du einfach (ohne den ganzen restlichen Code) ein



try{
static final String[] arg = {"pdflatex","test2.tex"};
this.getRuntime().exec(arg);
}catch...

Machst?

MfG Bischi

PS: Das static final kannst du wahrscheinlich auch weglassen, bin mir diesbezüglich nicht so ganz sicher...

PS2: Vielleicht musst du das dann so ändern:

String[] arg = new String[2];
arg[0]=...
arg[1]=...

blaurot
21-07-2006, 20:21
hallo
musste static final weglassen und this kann ich nicht im static Kontext benutzen. deswegen habe ich dann folgendes gemacht
String[] arg = {"pdflatex","test2.tex"};
RT.exec(arg);
aber da erhalte ich dieselbe log-datei wie vorher
aber generell müsste sowas schon gehen oder?

bischi
21-07-2006, 21:27
Bei mir gehts auch nicht:

"End of file at terminal.."

Besserer Vorschlag: Erstell ne batch/Shellscript-Datei, aus welcher du ein Java-Proggi startest, welches eine Bat/ShScript-Datei erstellt, die du nach beenden des Java-Proggi aus der ersten aufrufst.

also etwa so:

--- programm.bat ---
java meinJavaProgramm // erzeugt compile.bat
compile

--- compile.bat muss etwa so aussehen ---
pdflatex beispiel.tex


Ist zwar nicht 100% sauber, funktioniert aber einwandfrei! (hab bei mir ne ähnliche Lösung am laufen...)

MfG Bischi

anda_skoa
22-07-2006, 19:31
Bei exec wird er Prozess gestartet.

Was sagt der Exit Value des Process? Bzw vermisse ich einen waitFor Aufruf um auf das Ende des Aufrufs zu warten.

Ciao,
_

blaurot
22-07-2006, 20:07
hallo
ich mache systemaufrufe das erstemal und hatte mich am buch "java für Fortgeschrittene"von hendrich orientiert, da hatte ich nichts vom waitfor aufruf gelesen.. wie geht das?
wer ist der exit value?
danke katrin

nul
24-07-2006, 11:21
Waitfor ist im Umgang immer eine gute Idee. Damit wartest du so lange bis der Prozess den du erzeugt hast auch wirklich beendet ist. Sonst kannst du dir nie sicher sein ob auch wirklich das Programm beendet wurde (naja, haengt immer vom Fall ab).

Der Exit Value eines Prozesses ist der Rueckgabewert der main-Funktion (Auch wenn Java's main eigentlich nichts (void) zurueckliefert so ist dieser doch vorhanden). Siehe dazu
http://java.sun.com/j2se/1.5.0/docs/api/

blaurot
24-07-2006, 13:01
also müsste ich nach
String[] arg = {"pdflatex","test2.tex"};
RT.exec(arg);
eine if-abfrage machen:
if(RT.waitfor()==0) System.exit();

nul
24-07-2006, 13:17
So ungefaehr:
String[] arg = {"pdflatex","test2.tex"};
Process p = RT.exec(arg);

if( p.waitfor() == 0 )
System.out.println( "pdflatex ok" );
else {
System.out.println( "pdflatex error: " + p.exitValue );
System.exit( p.exitValue );
}

blaurot
04-08-2006, 09:12
hallo
kann bitte mal jemand testen, ob das so funktioniert, das wäre echt lieb..
bei mir funktioniert es bis zum ps2pdf-aufruf, dass dieser aufruf nicht geht, liegt bei mir aber daran, dass er auch ohne java nicht funktioniert.

public class Pdf {
static Runtime RT=null;
static Process PR=null;

public static void pdferstellen(){
RT=Runtime.getRuntime();
try{

String[] arg = {"latex","test2"};
RT.exec(arg);
String[] args={"dvips", "test2.dvi"};
RT.exec(args);
String[] argsz={"ps2pdf", "test2.ps"};
RT.exec(argsz);
/*if(PR.waitFor()==0){
System.out.println("PDF-Datei erstellt");

}
else {
System.out.println( "pdflatex error: " + PR.exitValue() );
System.exit( PR.exitValue() );
}*/

}
catch(Exception e){
System.out.println("Fehler:"+e.toString());
}
System.exit( 0 );
}
public static void main (String args[]){
pdferstellen();
}
}


vielen dank, katrin

blaurot
11-08-2006, 10:48
hallo
da ich den zweiten aufruf erst ausführen sollte wenn der erste beendet ist, dachte ich ich könnte das mit der if-abfrage machen.
allerdings bekomme ich jetzt eine fehlermeldung , die mir nix sagt. Fehler:java.lang.NullPointerException

d.h ja er müsste gar nicht erst in den try-block gehen, aber ohne der if-Abfrage führt er die proesse doch durch....

warum übergebe ich eigentlich dem exit() 0, ich habe das irgendwie so verstanden, dass diese methode mir diesen wert zurück gebt, jenachdem ob der prozess erfolgreich war?

gruß katrin

public class Pdf extends Ausgabe {
static Runtime RT=null;
static Process PR=null;

public static void pdferstellen(){
RT=Runtime.getRuntime();
try{

String[] arg = {"latex","test3"};
RT.exec(arg);
if(PR.waitFor()==0){
String[] args={"dvips", "test3.dvi"};
RT.exec(args);

}
else {
System.out.println( "latex error: " + PR.exitValue() );
System.exit( PR.exitValue() );
}

}
catch(Exception e){
System.out.println("Fehler:"+e.toString());
}
System.exit( 0 );
}
public static void main (String args[]){
pdferstellen();
}
}

bischi
11-08-2006, 16:55
Fehler:java.lang.NullPointerException

Naja - das ist eine der häufigsten Fehlermeldungen und bedeutet, dass du auf irgend ein Objekt zugreifen möchtest, das nicht initialisiert wurde...

Mal die entsprechende Zeile genauer anschauen,

MfG Bischi

RedCloud
12-08-2006, 08:49
hallo
da ich den zweiten aufruf erst ausführen sollte wenn der erste beendet ist, dachte ich ich könnte das mit der if-abfrage machen.
allerdings bekomme ich jetzt eine fehlermeldung , die mir nix sagt. Fehler:java.lang.NullPointerException

d.h ja er müsste gar nicht erst in den try-block gehen, aber ohne der if-Abfrage führt er die proesse doch durch....

warum übergebe ich eigentlich dem exit() 0, ich habe das irgendwie so verstanden, dass diese methode mir diesen wert zurück gebt, jenachdem ob der prozess erfolgreich war?

public class Pdf extends Ausgabe {
static Runtime RT=null;
static Process PR=null;


danach wird PR doch gar nicht wieder benutzt ...

String LArg = "\\batchmode \\input test3.tex";
String[] arg = {"latex", LArg};
PR=RT.exec(arg);
if(PR.waitFor()==0){ System.out.println("dvi-Datei erstellt"); }
else { System.out.println( "LaTeX error: " + PR.exitValue() );
System.exit( PR.exitValue() ); }

rc

anda_skoa
12-08-2006, 14:58
Fehler:java.lang.NullPointerException

Es fehlt die Zuweisung auf PR, daher ist es null



warum übergebe ich eigentlich dem exit() 0, ich habe das irgendwie so verstanden, dass diese methode mir diesen wert zurück gebt, jenachdem ob der prozess erfolgreich war?


System.exit gibt den übergebenen Wert am Programmende an den Aufrufer des Programms zurück, damit der eventuell je nach Wert anders reagieren kann.

Häufigster Anwendungsfall ist die Abarbeitung mehrerer zusammenhängender Befehle in einem Script bzw einer Batchdatei, wo abgebrochen werden soll, wenn einer der Verarbeitungsschritte nicht geklappt hat.

Übrigens, falls das Ziel deines Programms die Generierung eines PDF aus einer Latexdatei ist, sollte das doch viel einfacher in einem Schritt mittels pdflatex gehen, oder?

Ciao,
_

blaurot
13-08-2006, 00:28
hallo
wahrscheinlich habt ihr recht und ich mache es zu kompliziert mit mehreren prozessen.
ich habe es jetzt nochmal mit der pltx.bat gemacht, jetzt habe ich nur das problem, das ich es nicht testen kann, weil mein ps2pdf nicht funktioniert(deswegen war ich auch auf die mehreren prozesse umgestiegen...)
mit pdflatex kann man dies nicht machen, da meine tex-datei balkendiagramme enthält.
ich habe mein programm trotzdem laufen lassen, kam auch keine fehlermeldung. aber da inm if und im else teil eine println-anweisung steht, müsste er doch auf jeden fall was ausgeben, es kommt aber garnix. das finde ich sehr merkwürdig.
gruß katrin

public class Pdf2 {
static Runtime RT=null;
static Process PR=null;

public static void pdferstellen(){
RT=Runtime.getRuntime();
try{

String[] arg = {"pltx.bat","test3"};
PR=RT.exec(arg);
if(PR.waitFor()==0){
System.out.println("Pdf-Datei erstellt");
}
else {
System.out.println( "latex error: " + PR.exitValue() );
System.exit( PR.exitValue() );
}

}
catch(Exception e){
System.out.println("Fehler:"+e.toString());
}
System.exit( 0 );
}
public static void main (String args[]){
pdferstellen();
}



}

RedCloud
13-08-2006, 12:10
hallo
wahrscheinlich habt ihr recht und ich mache es zu kompliziert mit mehreren prozessen.
ich habe es jetzt nochmal mit der pltx.bat gemacht, jetzt habe ich nur das problem, das ich es nicht testen kann, weil mein ps2pdf nicht funktioniert(deswegen war ich auch auf die mehreren prozesse umgestiegen...)
mit pdflatex kann man dies nicht machen, da meine tex-datei balkendiagramme enthält.
ich habe mein programm trotzdem laufen lassen, kam auch keine fehlermeldung. aber da inm if und im else teil eine println-anweisung steht, müsste er doch auf jeden fall was ausgeben, es kommt aber garnix. das finde ich sehr merkwürdig.


String LArg = "\\batchmode \\input test3.tex";
String[] arg = {"latex", LArg};

hatte ich dir doch extra geschrieben. Ansonsten hängt doch sofort das System, wenn TeX einen Fehler entdeckt und auf eine Eingabe wartet ...

angesehen davon verstehe ich deinen ganzen Aufstand nicht. Wenn dein ps2pdf nicht geht, dann ist dein GhostScript im Eimer, denn ps2pdf ist nichts weiter als ein Skript dafür. Installiere das aktuelle ghostscript und hoe dir ps2pdf (bei MiKTEX ist alles dabei) und fertig ist ...

rc

fuzzycontrol
15-08-2006, 10:55
Vielleicht hilft dir ja auch dieser Thread weiter:
http://www.mrunix.de/forums/showthread.php?p=211428