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.