Marc Reichelt: Drucken (die *wievielteauchimmer*)

Hallo an alle,

nun habe ich mich seit einigen Wochen nicht mehr damit befasst, und jetzt holt mich mein altes Problem wieder ein: Drucken mit Java.
Ich bekomme es einfach nicht hin. :-(

Ich benutze XSL-FO als Ausgangsformat, und habe dank FOP (siehe API) folgende Formate zur Hand:
 - AWT (von Java)
 - MIF
 - PCL
 - PDF
 - PS

Die Konstante RENDER_PRINT des Driver-Objekts habe ich schon gesehen, allerdings bekomme ich bei Benutzung des dreizeiligen Codes von hier einen Fehler (es ist alles korrekt gesetzt!).

Driver driver = new Driver(foFile, null);  
driver.setRenderer(Driver.RENDER_PRINT);  
driver.run();

<fehlermeldung>
"Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Use renderer form of setRenderer() for PRINT
 at org.apache.fop.apps.Driver.setRenderer(Driver.java:353)"
</fehlermeldung>

Nun soll eines dieser Formate (welches davon ist mir egal) unter Windows gedruckt werden - und zwar nicht nur auf PostScript-fähigen Druckern, sondern auf "normalen" (sic!) Windows-Druckern. Auf PostScript-Druckern bekomme ich es hin. Unter Linux PS- oder PDF-Dateien zu drucken ist normalerweise kein Problem, aber unter Windows?

Folgendes habe ich schon probiert:
AcroRd32.exe /p /h <datei.pdf>

Der Befehl druckt mir dir PDF-Datei aus, lässt den Adobe Reader aber geöffnet. Daher schieße ich diesen nach ein paar Sekunden wieder ab:
taskkill /IM AcroRd32.exe

Das ist natürlich eine sehr grausame Lösung, die ich unbedingt vermeiden möchte, wenn es nicht irgendwie anders geht.

Mit Ghostscript habe ich es auch schon probiert, bekomme aber ziemlich schlechte Resultate (druckt über den Druckbereich hinaus, nur in schwarz/weiß, obwohl der Drucker Farbe unterstützt).

Kann mir jemand helfen? Ich wäre ihm äußerst dankbar - und beim nächsten Selftreffen gibt's gleich was schönes spendiert... :-)

Natürlich wäre es auch toll, wenn man OpenOffice.org irgendwie ansteuern könnte (am Besten die API), sodass es all diese Dinge übernimmt. Ich müsste dann zwar statt XSL-FO andere Dokumente (OpenDocument) erzeugen, doch das würde ich eingehen - immerhin würde dieser Code dann für viele Java-Programmierer eine schöne Lösung bedeuten, um zu Drucken oder PDF-Dateien zu erstellen.

Freundliche Grüße

Marc Reichelt || http://www.marcreichelt.de/

--
Linux is like a wigwam - no windows, no gates and an Apache inside!
Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
http://emmanuel.dammerer.at/selfcode.html
  1. Hallo nochmals,

    zur Konstante RENDER_PRINT habe ich kurz mal ein Beispiel erstellt (Datei Test.java):

    import java.io.IOException;  
    import java.io.StringReader;  
      
    import org.apache.fop.apps.Driver;  
    import org.apache.fop.apps.FOPException;  
      
    import org.xml.sax.InputSource;  
      
    public class Test {  
     public static void main(String[] args) {  
      // dies ist das XSL-FO  
      String xml =  
       "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +  
       "<fo:root xmlns:fo=\"http://www.w3.org/1999/XSL/Format\">\n" +  
       " <fo:layout-master-set>\n" +  
       "  <fo:simple-page-master master-name=\"dina4\" margin-right=\"40px\" margin-left=\"40px\" margin-top=\"40px\"" +  
          " margin-bottom=\"40px\" page-width=\"595px\" page-height=\"842px\">\n" +  
       "   <fo:region-body/>\n" +  
       "  </fo:simple-page-master>\n" +  
       " </fo:layout-master-set>\n" +  
       " <fo:page-sequence master-reference=\"dina4\">\n" +  
       "  <fo:flow flow-name=\"xsl-region-body\">\n" +  
       "   <fo:block>Text</fo:block>" +  
       "  </fo:flow>\n" +  
       " </fo:page-sequence>\n" +  
       "</fo:root>\n";  
      // XML-Parser mit obigem XML anlegen  
      InputSource foInput = new InputSource(new StringReader(xml));  
      
      try {  
       // dieser Code soll das Dokument nun ausdrucken  
       Driver driver = new Driver(foInput, null);  
       // die nächste Zeile wirft die java.lang.IllegalArgumentException  
       driver.setRenderer(Driver.RENDER_PRINT);  
       driver.run();  
      }  
      catch (FOPException e) {  
       e.printStackTrace();  
      }  
      catch (IOException e) {  
       e.printStackTrace();  
      }  
     }  
    }  
    
    

    Fehlerausgabe:
    Exception in thread "main" java.lang.IllegalArgumentException: Use renderer form of setRenderer() for PRINT
     at org.apache.fop.apps.Driver.setRenderer(Driver.java:353)
     at Test.main(Test.java:34)

    Vielleicht trägt dieses "Trivialbeispiel" ja etwas zur Problemlösung bei.
    Die Dokumentation von FOP (JavaDoc) findet ihr auf meinem Webspace.

    Grüße

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
    http://emmanuel.dammerer.at/selfcode.html