Mit ‘Ghostscript’ getaggte Artikel

Drucken von PDF-Dateien mit Ghostscript aus Java-Webservices heraus

Freitag, 05. Juni 2009

Problem:

Vorhandene PDF-Dateien sollen mit Ghostscript aus im Tomcat laufenden Java-Webservices heraus gedruckt werden. Das Betriebssystem ist Windows XP.

Lösung:

Nachdem Ghostscript installiert wurde, kann es z.B. mittels eines ProcessBuilders aus Java heraus gestartet werden.

        Process gsProcess = null;
        try {
            ArrayList<String> argList = new ArrayList<String>();
            argList.add("C:\\Programme\\gs\\gs8.64\\bin\\gswin32c.exe");
            argList.add("-sDEVICE#mswinpr2");
            argList.add("-sOutputFile#%printer%" + printerName); // printerName = Name des Druckers
            argList.add("-dBATCH");
            argList.add("-dNOPAUSE");
            argList.add("-dNOPAGEPROMPT");
            argList.add("-dNOPROMPT");
            argList.add("-dPrinted");
            argList.add(fileName); // fileName = Pfad zu der zu druckenden PDF-Datei
 
            ProcessBuilder processBuilder = new ProcessBuilder(
                argList);
            gsProcess = processBuilder.start();
 
            // Konsumieren der Ausgaben von Ghostscript:
            BufferedInputStream inputStream = new BufferedInputStream(gsProcess.getInputStream());
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            BufferedInputStream errInputStream = new BufferedInputStream(gsProcess.getErrorStream());
            BufferedReader errReader = new BufferedReader(new InputStreamReader(errInputStream));
 
            String line;
            while ((line = reader.readLine()) != null){
                System.out.println("GHOSTCRIPT> " + line);
            }
 
            while ((line = errReader.readLine()) != null){
                System.err.println("GHOSTSCRIPT [ERROR]> " + line);
            }
 
            int returnValue = gsProcess.waitFor();
            if (returnValue == 0) {
                System.out.println("Returnwert des ghostscript-Aufrufs ist 0");
            }
            else {
                System.err.println("Returnwert des ghostscript-Aufrufs ist " + returnValue);
                ... // Fehlerbehandlung
            }
 
            // Alle Streams schließen
            gsProcess.getInputStream().close();
            gsProcess.getOutputStream().close();
            gsProcess.getErrorStream().close();
 
        } catch (Exception e) {
            ...
        }

Um nun einen reibungslosen Ablauf aus dem Tomcat heraus zu garantieren, sollte der Dienst mit den Rechten eines Admins laufen (kann unter Systemsteuerung->Verwaltung->Dienste eingestellt werden). Hintergrund ist, dass der Webservice Zugriff auf Systemressourcen (z.B. Netzwerkdrucker oder ähnliches) benötigen könnte.


Christian Borkowski