Marc Reichelt: Drucken (die Zweite)

Hallo an alle,

wie ich neulich geschrieben habe, stehe ich vor dem Problem, mit Java Dokumente drucken zu müssen.
Das Erzeugen und Drucken von Grafiken (PNG) ist erledigt, und klappt vorzüglich.

Nun stehe ich vor einem anderen Problem: Ich möchte Dokumente (Tabellen, Texte etc.) drucken, auch nach PDF.
Das Erzeugen von PDF- und POSTSCRIPT-Dateien klappt mit FOP ganz gut, bei großen Bildern ist es aber enorm speicherfressend. Auch das Drucken klappt wunderbar - allerdings nur auf Postscript-fähigen Druckern.

Und da fangen meine Probleme an: Nicht-Postscript-Drucker (also die "Standard-Drucker") können keine PS-Dateien drucken. Zumindest unter Windows.
Stand jemand eventuell vor einem ähnlichen Problem, und möchte mir seine Kenntnisse mitteilen, wie er es gelöst hat? :-)

Apropos: OpenOffice kann doch auch Dokumente ausdrucken. Wie machen die das denn genau? Die bestmögliche Lösung wäre, wenn ich eine API von OpenOffice einbinden könnte, mit der ich OpenDocument-Dateien (Text- und Tabellendokumente) drucken und nach PDF konvertieren kann. Denn die bekommen das ja auch irgendwie hin, und AFAIK sogar ohne mächtig viel Speicher zu verbrauchen. Ich habe meine Gründe, dies so zu sagen - ich sitze hier an einem Rechner mit 1 GB RAM, und stoße trotzdem sehr schnell an die Grenzen von FOP.

Grüße & vielen Dank im Voraus

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,

    das Problem ist gelöst.
    Die Lösung heißt für mich PDFBox - die kann nicht nur PDF-Dateien direkt drucken, sondern sogar Texte aus vorhandenen PDF-Dateien extrahieren. Zwar ist es momentan noch ein kleiner Umweg (XSL-FO -> FOP: PDF-Datei erstellen -> Über PDFBox drucken), aber ein sehr gut funktionierender.

    Wenn mir noch jemand sagen könnte, wie man mit XSL-FO erstellte Dokumente (siehe FOP) direkt aus Java aus auf beliebigen Druckern ausgeben kann, wäre das natürlich noch ein Bonus.

    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 Marc,

      FOP unterstüzt laut der Seite auf direktes ausdrucken. Ich konnte da aber keine Klassendokumentation finden. Weißt Du, wo die versteckt ist?
      Außerdem kann man sich wohl auch direkt AWT-Grafifkobjekte für die einzelnen Seiten erzeugen lassen. Die müsste man eigentlich der Java Printing API füttern können.

      Grüße

      Daniel

      1. Hallo Daniel,

        FOP unterstüzt laut der Seite auf direktes ausdrucken. Ich konnte da aber keine Klassendokumentation finden. Weißt Du, wo die versteckt ist?
        Außerdem kann man sich wohl auch direkt AWT-Grafifkobjekte für die einzelnen Seiten erzeugen lassen. Die müsste man eigentlich der Java Printing API füttern können.

        Auch, wenn FOP direkt drucken könnte, würde ich diese Funktion wegen der ungenügenden Dokumentation nicht finden. Erstaunlich, dass bei einem etablierten OpenSource-Projekt die Dokumentation so schlecht sein kann.
        Die Dokumentation habe ich auch nur über mehrere Umwege bekommen: Ich habe mir eine deb-Datei zusammengesucht, heruntergeladen und diese extrahiert. Damit andere die Doku auch mal selbst online lesen können, ohne große Suchen oder Umwege gehen zu müssen, habe ich die Doku mal kurzerhand online gestellt (ist noch am Hochladen):
        http://www.marcreichelt.de/misc/fop_javadoc/fop-doc_0.20.5-5_all/

        Außerdem gibt's die Dokumentation auch als ZIP-Datei zum Herunterladen:
        http://www.marcreichelt.de/misc/fop_javadoc/fop-doc_0.20.5-5_all.zip

        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 Marc,

          Auch, wenn FOP direkt drucken könnte, würde ich diese Funktion wegen der ungenügenden Dokumentation nicht finden. Erstaunlich, dass bei einem etablierten OpenSource-Projekt die Dokumentation so schlecht sein kann.

          Naja, das Javadoc-Zeug ist ja soweit ganz OK. Man muss es nur erst mal finden. Vermutlich ist das dabei, wenn man den Quelltext runterläd.

          Ich würde mal versuchen ein Driver-Objekt mit RENDERER_PRINT zu verwenden. Das scheint zum Ausdrucken gut zu sein.
          Unter < http://www.marcreichelt.de/misc/fop_javadoc/fop-doc_0.20.5-5_all/org/apache/fop/apps/Driver.html#RENDER_PRINT> steht außerdem, dass man dafür keinen OutputStream angeben muss. Daher wird dieser Renderer wohl irgend was anderes tun, (z.B. direkt den Druckdialog öffnen).

          Wenn das nicht klappt, würde ich den AWTRenderer verwenden.
          Dafür gibt es ein Beispiel am Anfang der Dokumentation der Driver-Klasse.
          Der implementiert direkt java.awt.print.Printable und kann somit direkt an die Java Printing API verfüttert werden.
          Was nicht klar wird in der Doku, ist, was dieser Translator macht, den ein AWTRenderer braucht. Ich würd' mal versuchen null anzugeben oder eine Implementierung, die einfach keinen dieser Keys findet, die der wohl auflösen können soll. Notfalls hilft da wohl nur Quellcode lesen.

          Die Orginaldoku ist das aber nicht oder weshalb ist die auf Deutsch?

          Grüße

          Daniel

          1. Hallo Daniel,

            Ich würde mal versuchen ein Driver-Objekt mit RENDERER_PRINT zu verwenden. Das scheint zum Ausdrucken gut zu sein.

            Schon probiert, bei mir wurde der Drucker damals einfach nicht angesprochen. Ich werde es aber nochmals probieren.

            Unter http://www.marcreichelt.de/misc/fop_javadoc/fop-doc_0.20.5-5_all/org/apache/fop/apps/Driver.html#RENDER_PRINT steht außerdem, dass man dafür keinen OutputStream angeben muss. Daher wird dieser Renderer wohl irgend was anderes tun, (z.B. direkt den Druckdialog öffnen).

            Ich habe damals auch keinen OutputStream angegeben, und er hat trotzdem nicht gedruckt. Einen Druckdialog konnte ich auch nirgends entdecken.

            Wenn das nicht klappt, würde ich den AWTRenderer verwenden.
            Dafür gibt es ein Beispiel am Anfang der Dokumentation der Driver-Klasse.
            Der implementiert direkt java.awt.print.Printable und kann somit direkt an die Java Printing API verfüttert werden.
            Was nicht klar wird in der Doku, ist, was dieser Translator macht, den ein AWTRenderer braucht. Ich würd' mal versuchen null anzugeben oder eine Implementierung, die einfach keinen dieser Keys findet, die der wohl auflösen können soll. Notfalls hilft da wohl nur Quellcode lesen.

            Wie gesagt, ich benutze ja derzeit die PDFBox, um die entstehenden PDF-Dateien auszudrucken. Eine Druckmethode, die direkt über FOP funktioniert, wäre natürlich schön - zumal die Programmierer ja eine Konstante RENDERER_PRINT implementiert haben.
            Ich werde das bald nochmals testen, und dann hier die Ergebnisse veröffentlichen.

            Die Orginaldoku ist das aber nicht oder weshalb ist die auf Deutsch?

            Wo ist die bittesehr auf deutsch? ;-)

            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 Marc,

              Wo ist die bittesehr auf deutsch? ;-)

              Die Schnittstelle Translator ist auf deutsch dokumentiert.
              Es ist tatsächlich sonst alles englisch. Irgendwie hab ich das gestern gar nicht mehr gemerkt, obwohl ich es gelesen habe ;-)

              Grüße

              Daniel