Mit ‘PDF’ getaggte Artikel

PDF Dokumente für den Druck

Freitag, 06. November 2009

Das PDF-Format ist eine einfache Art Dokumente auszutauschen, die wohl jedem Computernutzer bekannt ist. Jemand verfasst ein Dokument und erzeugt z.B. mittels der OpenOffice Suite ein PDF daraus, welches von jemand anderem mit einem entsprechendem Viewer wiedergegeben werden kann. Bei diesen Schritten gibt es im Normalfall keine Probleme, was das Arbeiten mit PDF-Dateien auszeichnet.
Die sehr umfangreiche PDF-Spezifikation ([SPEC]) lässt allerdings vermuten, dass das nicht immer der Fall ist, wenn man in den professionellen Bereich vordringt.

Folgendes Problem beschäftigte uns:
Um PDFs mit unserer Software weiterverarbeiten und letztendlich drucken zu können, ist es notwendig, dass sie das DIN A4 Format haben – hierbei wird die MediaBox der Seite geprüft. Es lag ein Dokument vor, welches die A4-Maße deutlich überschritt und somit zurückgewiesen wurde. Eine Analyse zeigte, dass die MediaBox, wie vermutet, von den gültigen Maßen abwich – entgegen allen Erwartungen besagte die Anzeige der Eigenschaften in einem PDF-Viewer, dass es sich trotzdem um ein A4 Dokument handelt. Die PDF-Spezifikation musste Klarheit verschaffen.
Neben der MediaBox gibt es weitere “Box”en – z.B. TrimBox, CropBox – die Einfluss auf die “PageBoundaries” eines Dokuments haben (s. [WIKI]). Die MediaBox beschreibt lediglich die physikalischen Ausmaße des Zielmediums – in unserem Fall A4. Das Dokument, welches wir bekommen hatten, wurde für einen Druckprozess erzeugt. Damit enthielt es neben dem eigentlichen Inhalt noch Meta-Informationen, wie z.B. Druckmarken, Falzmarken, die für den Druckprozess relevant sind. Diese Markierungen dürfen natürlich nicht auf den Inhalt gedruckt werden. So ist es nachvollziehbar, dass die Meta-Informationen auf einem eigenen Bereichen erscheinen müssen, um den das physische Medium (die MediaBox) vergrößert wird. Die Lösung des Problems war letztendlich, dass die PDFs nicht für den Druck erzeugt werden und somit die MediaBox wieder der Größe des Inhalts entspricht.
Positiver Nebeneffekt war, dass auch weitere nicht benötigte Informationen (Farbprofile, etc.) nicht mehr im PDF vorhanden waren und die Dateigröße deutlich gesenkt werden konnte – von ca. 2MB auf 600kb.

Quellen:
[SPEC] PDF Spezifikation Version 1.7
[WIKI] PDF in Wikipedia


Andreas Siepert


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