tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
13
ZUGRIFFE
808
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Yersinia Yersinia ist offline Mitglied
    Registriert seit
    Mar 2006
    Beiträge
    11
    Hi,
    ich habe folgendes Problem.

    Ich brauche eine Möglichkeit aus einer .tex Datei eine pdf Datei zu erzeugen. Unter Windows funktioniert das eigent. schon ganz gut, jedoch brauche ich eine Plattformunabhängige Lösung.

    Windows Lösung:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
            try {
                Runtime rt = Runtime.getRuntime();
                Process proc = rt.exec("cmd /c start pdflatex -output-directory=\""+desktop+"\""+" \""+template+"\"");
                int exitVal = proc.waitFor();
                System.out.println("Process exitValue: " + exitVal);
            } catch (Throwable t) {
                t.printStackTrace();
            }

    Lg
     

  2. #2
    SE Tutorials.de Gastzugang
    Also ich würde wenn es sowas gibt eine PDF-Lib für Java verwenden. Ich weis aber nicht ob es reine Java-Implementierungen gibt oder nur welche mit C-Lib's ... müsste man mal googlen
     

  3. #3
    Yersinia Yersinia ist offline Mitglied
    Registriert seit
    Mar 2006
    Beiträge
    11
    Hi,
    vielen Dank für die schnelle Antwort.
    Hättest du irgendwelche Links für mich?
    Für Java hab ich schon sehr oft gegooglet aber leider überhaupt nichts gefunden.
    Wir würde ich denn eine C-Lib in Java verwenden?

    Lg
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Es gibt keine Latex-PDF Bibliothek. Latex ist doch ein relativ komplexes System welches nicht aus einem einzelnen Programm / Datei besteht.

    Verwende doch einfach den ProzessBuilder und verzichte auf den Aufruf von cmd - das brauchst du doch gar nicht.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    SE Tutorials.de Gastzugang
    Also Google liefert bei dem hier "java pdf lib" gleich als ersten Eintrag die Seite http://itextpdf.com
    Ich habs mir nicht genau angesehen aber es ist eine Lib die es für Java und C# gibt. Die Java-Lib sieht mir nach einer reinen Java-Implementierung aus ... also Plattformunabhängig.
    Damit solltest du dich vielleicht mal näher beschäftigen.
     

  6. #6
    Yersinia Yersinia ist offline Mitglied
    Registriert seit
    Mar 2006
    Beiträge
    11
    Hi.

    Hab leider mit dem ProzessBuilder noch nie gearbeitet. Wie würde denn der Aufruf aussehen?
    In etwa so?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
     try
            {
                ProcessBuilder texBuilder = new ProcessBuilder("pdflatex", url);
                Process p = texBuilder.start();
                System.out.println("latex wird kompiliert");
                p.waitFor();
            }
            catch (InterruptedException ex)
            {
                System.out.println(ex.toString());
            }
            System.out.println("Fertig");

    Edit:
    Danke an SPiKEe. Ich werde es mir mal näher anschauen.

    Lg
     

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von SPiKEe Beitrag anzeigen
    Also Google liefert bei dem hier "java pdf lib" gleich als ersten Eintrag die Seite http://itextpdf.com
    Ich habs mir nicht genau angesehen aber es ist eine Lib die es für Java und C# gibt. Die Java-Lib sieht mir nach einer reinen Java-Implementierung aus ... also Plattformunabhängig.
    Damit solltest du dich vielleicht mal näher beschäftigen.
    Was soll das bringen? Du weißt offenbar nicht was Tex/Latex ist?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  8. #8
    SE Tutorials.de Gastzugang
    Das ist vollkommen richtig =) aber aufklären lass ich mich immer gerne.
     

  9. #9
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von SPiKEe Beitrag anzeigen
    Das ist vollkommen richtig =) aber aufklären lass ich mich immer gerne.
    TeX bzw. Latex ist ein Textsatzsystem. Wikipedia sagt sicher mehr. Du müßtest erstmal den .tex Code interpretieren usw. bevor es ans Generieren der Ausgabe geht. Da ist die Erzeugung eines PDF das geringste Problem.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  10. #10
    Yersinia Yersinia ist offline Mitglied
    Registriert seit
    Mar 2006
    Beiträge
    11
    iText scheint eine Lib zu sein, mit der ich PDF erzeugen kann. Leider muss der Latex Code ja kompiliert werden. Daher wird es wahrscheinlich keinen anderen Weg geben, also extern pdflatex aufzurufen, da sonst die ganzen Tex Packete in Java implementiert werden müssten.
    Also werd ich mal bei meinem Ansatz des Prozess Builders weitergucken! Bin für jede Hilfe dankbar

    Lg
     

  11. #11
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Yersinia Beitrag anzeigen
    Hi.

    Hab leider mit dem ProzessBuilder noch nie gearbeitet. Wie würde denn der Aufruf aussehen?
    In etwa so?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
     try
            {
                ProcessBuilder texBuilder = new ProcessBuilder("pdflatex", url);
                Process p = texBuilder.start();
                System.out.println("latex wird kompiliert");
                p.waitFor();
            }
            catch (InterruptedException ex)
            {
                System.out.println(ex.toString());
            }
            System.out.println("Fertig");
    Ja, sieht gut aus. Du solltest natürlich noch den Rückgabewert des Prozesses prüfen.

    Und evtl. die Standard-Ausgabe / -Fehlerausgabe lesen damit der Prozess nicht hängt weil die Ausgabepuffer voll sind.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  12. #12
    Yersinia Yersinia ist offline Mitglied
    Registriert seit
    Mar 2006
    Beiträge
    11
    Hm, leider scheint das ganze noch nicht zu funktionieren. Er kommt bis zur Ausgabe "Latex wird kompiliert" und dann steht er. Er kommt auch nie zum Rückgabewert oder ähnlichem.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
     ProcessBuilder texBuilder = new ProcessBuilder("pdflatex", url);
            Process p = texBuilder.start();
            System.out.println("latex wird kompiliert");
            try
            {
                p.waitFor();
            }
            catch (InterruptedException ex)
            {
                System.out.println(ex.toString());
            }
            
            System.out.println(p.exitValue());

    edit:
    muss ich hier noch irgendwie ein working-dir angeben?
     

  13. #13
    SE Tutorials.de Gastzugang
    Gut ... da hab ich mich wohl etwas verplant nur nach dem PDF gerichtet ...
    Wenn man sich TeX anguckt dann sieht man wirklich das dann aus dem compileten Document ein PDF zu machen wirklich da einfachste darans ist ...

    ICH HAB NICHTS GESAGT

    Zum Post
    Wie deepthroat bereits erwähnte solltest du auch die Streams auslesen. Das wären der ErrorStream und der OutputStream. Das Problem hatten wir schon öfters das die entsprechenden Programme stehen geblieben sind weil die Buffer dieser Streams voll waren. Ein einfachs close() hilft auch aber man sollte die Streams wirklich auslesen um Fehlermeldungen zu erhalten.
     

  14. #14
    Yersinia Yersinia ist offline Mitglied
    Registriert seit
    Mar 2006
    Beiträge
    11
    Perfekt. Vielen Dank! Es funktioniert nun! Anscheinend war wirklich der InputStreamBuffer voll und daher ist er stecken geblieben (oder sowas in der Art - bin in Java net ganz so fit).

    Dieser Code funktioniert nun bei mir. Als nächstes werde ich ihn schnell noch unter linux testen.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
     ProcessBuilder texBuilder = new ProcessBuilder("pdflatex", url, "-output-directory=" + desktop);
            texBuilder.redirectErrorStream(true);
            Process p = texBuilder.start();
            System.out.println("latex wird kompiliert");
            String tmp = null;
            String error = null;
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
     
            try
            {
                while ((tmp = br.readLine()) != null)
                {
                    error = error + tmp + "\n";
                }
     
            }
            catch (IOException ioe)
            {
                ioe.printStackTrace();
            }
     
            System.out.println(error);
     
            try
            {
                p.waitFor();
            }
            catch (InterruptedException ex)
            {
                System.out.println(ex.toString());
            }
            if (p.exitValue() == 0)
            {
                System.out.println("Fertig");
            }

    Lg und danke an euch beiden!

    EDIT:
    Es kann natürlich sein, dass er Code sehr "hässlich" ist. Bin über Verbesserungen natürlich sehr froh.
     

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 01.05.08, 13:38
  2. Antworten: 1
    Letzter Beitrag: 17.02.07, 18:39
  3. COM4J eine alternative Java - COM Bridge mit Java 5 Mitteln
    Von Thomas Darimont im Forum Java Technology News
    Antworten: 0
    Letzter Beitrag: 10.10.06, 17:49
  4. Java is Hot! Java News - Java Polis 2005
    Von Thomas Darimont im Forum Java
    Antworten: 0
    Letzter Beitrag: 03.12.05, 16:23
  5. Rendering Performance von Java 2D / Swing verbessern unter Java 5
    Von Thomas Darimont im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 06.02.05, 00:58

Stichworte