Du bist nicht angemeldet.

migu

free rider

  • »migu« ist männlich
  • »migu« ist der Autor dieses Themas

Beiträge: 2 643

Registrierungsdatum: 11.12.2001

Beruf: Developer

1

13.09.2007, 16:43

PDFs dynamisch erzeugen - womit?

Hallo,
für die dynamische Erzeugung von PDFs aus Eingabedaten kenne ich bis jetzt nur zwei Werkzeuge:

a) XSL-FO + FO-Processor (z.B. Apache FOP)
b) UJAC-Print (basiert auf Lowagie iText)

a) hat den Vorteil, dass es etablierte W3C-Standards (XML, XSLT, XSL-FO) verwendet. Diese sind aber naturgemäß komplexer als einfachere Lösungen. Vorteil ist die Mächtigkeit von XSLT/XPath und dass es verschiedene Prozessoren für FO gibt. Durch die Transformation der Eingabe (beliebiges XML) in die Ausgabe (XSL-FO) wird eine gute Trennung von Daten und Gestaltung erreicht. Dies erhöht aber auch die Komplexität und erschwert dadurch den Umgang. Üblicherweise muss man XSLT u. XPath erlernen, um XSL-FO produktiv erinsetzen zu können.

b) besitzt eine eigene Template-Sprache (XML). Die Templates werden in iText-Anweisungen übersetzt. Aus dem Template heraus kann man direkt auf Java-Beans und Java-Collections zugreifen. Die Bindung an Java ist demnach sehr stark. Das halte ich für einen Nachteil.
Positionen und Längen können in UJAC nur in pt (Punkt) angegeben werden (wie in PS/PDF). UJAC-Print ist dadurch einfacher als XSL-FO, dass die Template-Sprache sowohl die Dokumentenbeschreibung als auch den Zugriff auf Eingabedaten leistet. Von UJAC-Print habe ich auf den ersten Blick hin nicht so viel gehalten, weil die Template-Sprache

Welches Wekzeug haltet ihr für mächtiger oder konzeptuell besser? Kennt ihr weitere Werkzeuge zur template-gestützten Dokumentenerzeugung?

Mit a) habe ich schon erfolgreich Dokumente erzeugt (Lehrevaluations-Ergebnisse).

-migu
tar: Anlegen eines leeren Archivs wird feige verweigert.

Hazel

Praktikant

  • »Hazel« ist männlich

Beiträge: 21

Registrierungsdatum: 10.01.2006

2

13.09.2007, 19:08

Mit C# und dem .NET Framework kann man relativ einfach selber PDF Files generieren. Hab grad nicht im Kopf wie das geht aber hier sind zwei Artikel zu dem Thema:

http://www.codeproject.com/showcase/TallComponents.asp
http://www.codeproject.com/showcase/pdfrasterizer.asp

Hoffe das hilft. ;)
Think positive. Think big.

KreiS

Senior Schreiberling

  • »KreiS« ist männlich

Beiträge: 701

Registrierungsdatum: 17.12.2001

Wohnort: Hannover

Beruf: moep

3

13.09.2007, 20:10

Eines vorweg, bei beiden Sachen muss man wohl etwas erlernen oder nicht? XSLT kann man gut wieder verwenden :)

Meine Erfahrung mit XSLT/XSL-FO sind ganz gut. Zwar hat man hier und da Grenzen, aber es gibt Wege und Mittel. Der große Vorteil ist schon das man XML hat (Entweder man hat ne XML Quelle, erzeugt sich XML oder serialisiert Java Objekte ins XML, alles gemacht und funktioniert gut!). Ich glaub mit Transparenz gabs damals probleme :)

XSLT kann man lernen, wenn man es verstanden hat wie das funktioniert und wie man es schreiben muss. XPath ist halb so schlimm.
Tendenziell braucht man schon erfahrung um saubere XSLTs zu schreiben. Dazu braucht es einfach erfahrung um zu wissen wie man es gliedern muss und ob nicht mehrstufige Transformation besser ist.
Ich hab ziemlich viel in XSLT umgesetzt, gepflegt, auch xsl-fo gepflegt, erweitert, korrigiert.......es geht alles. Es ist nicht so schwer. Von Grund neu schreiben ist aber das schwerste vom Gefühl. Pflege war das kleinste Problem, bin aber da kein Anfänger :)

Ahja, was wichtig bei den xslt und fo Geschichten, eine gute IDE wo man testen, probieren, debuggen kann. Ohne geht gar nicht richtig. Sollte man nicht unterschätzen.

So, wenn ne Java Anbindung nötig ist, es gibt opensource XSL Transformatoren, also kann man diese erweitern ;) Sonst wenn ich es richtig im Kopf habe gabs auch ne offiziele Schnittstelle für eigene Funktionen bei Saxon.......
kaneda spring <-> ks <-> KreiS
"surrender is an option ...time to change everything" (ks '04)

Dakota-Indianer(Weisheit),"Wenn Du entdeckst, dass Du ein totes Pferd reitest, steig ab"

dfex

Junior Schreiberling

  • »dfex« ist männlich

Beiträge: 248

Registrierungsdatum: 11.12.2001

4

13.09.2007, 20:16

RE: PDFs dynamisch erzeugen - womit?

Etwas entfernter von der eigentlichen Suche existieren auch noch Reportgeneratoren/designer wie z.B. Crystal Reports oder JasperReports.

JasperReports (http://jasperforge.com/) ist OpenSource und bietet viele Möglichkeiten. Definiert werden Reports mit Hilfe von XML. Ein Designer existiert mit iReport auch. Daten können aus diversen Quellen verwendet werde: von Datenbanken, über XML bis hin zu CustomDataSources, die dann komplett in Java geschrieben werden. JasperReports kann dann wahlweise direkt in einer GUI dargstellt werden, oder PDF Dateien generieren.

migu

free rider

  • »migu« ist männlich
  • »migu« ist der Autor dieses Themas

Beiträge: 2 643

Registrierungsdatum: 11.12.2001

Beruf: Developer

5

19.09.2007, 10:49

Danke für eure Antworten!

Ich hatte nicht erwähnt, dass eine Anforderung freies Seiten-Layout ist. Außerdem soll die PDF-Erzeugung in einem Web-Service stattfinden. Das PDF soll dann an den Aufrufer zurück geschickt werden. Deshalb müssen die Daten (auf dem WS-Client) streng von der PDF-Erzeugung (auf dem WService) getrennt werden. Mit anderen Worten: Der Client soll nichts von der konkreten Methode der PDF-Erzeugung erfahren bzw. wissen müssen, um die Daten an den WService liefern zu können.

JasperReports habe ich mir einmal genauer angesehen. Mit JasperReports ist man leider auf Report-Layouts beschränkt. Man kann dort nur Titel und wiederkehrende Elemente für die Reportdaten gestalten. Folgeseiten können dann nur das zuvor definierte, einheitliche Layout besitzen. JasperReports ist offenbar für meine Zwecke nicht geeignet.

XSL-FO hat den großen Vorteil, dass es den Inhalt sauber von der Gestaltung trennt. UJAC-Print tut dies überhaupt nicht. Dort weden Template-Funktionen, die bei XSL-FO von XSLT erledigt werden, in Java ausgeführt. Zum Beispiel kann man dynamische Tabellen anlegen, indem man ein "DataTable"-Objekt erzeugt und dieses mit Daten füllt (Klassen: Column, Row). Hier wäre die Bindung an die PDF-Erzeugung für eine Anwendung mit einem WS zu stark.

XSL-FO hat allerdings den Nachteil, dass der frei erhältliche FOP mitunter minderwertige Ergebnisse liefert; außerdem unterstützt er den Standard nicht vollständig. Die kommerziellen FO-Prozessoren sind allesamt zu teuer (ab ca. 3500 € pro Server-Lizenz).

Andere template-gestützte Dokumentgeneratoren scheint es nicht zu geben. Oder?
tar: Anlegen eines leeren Archivs wird feige verweigert.

neweb

Erfahrener Schreiberling

  • »neweb« ist männlich

Beiträge: 496

Registrierungsdatum: 16.06.2006

Wohnort: Hannover

6

19.09.2007, 12:28

Kostenlos wäre die Alternative mit html2ps und dann mit ps2pdf ein PDF draus machen. Dann kannst du HTML-Templates verwenden. Ob das wirklich schön ist, kann ich nicht sagen, und ob das Resultat schön ist, auch nicht, aber es ist kostenlos ;). Wie gut html2ps wirklich ist, weiß ich nicht.
Das Wesen der Dinge ist es, dass sie plötzlich verschwinden und dann unerwartet an einem ganz anderen Ort wieder auftauchen.


migu

free rider

  • »migu« ist männlich
  • »migu« ist der Autor dieses Themas

Beiträge: 2 643

Registrierungsdatum: 11.12.2001

Beruf: Developer

7

19.09.2007, 14:31

Zitat

Original von neweb
Kostenlos wäre die Alternative mit html2ps und dann mit ps2pdf ein PDF draus machen. Dann kannst du HTML-Templates verwenden. Ob das wirklich schön ist, kann ich nicht sagen, und ob das Resultat schön ist, auch nicht, aber es ist kostenlos ;). Wie gut html2ps wirklich ist, weiß ich nicht.
HTML ist ja ursprünglich nicht für die Druckausgabe konzipiert worden. Das ist genau der Grund, warum XSL entwickelt wurde. Punktgenaue Positionierung von Elementen in HTML ist zwar mit CSS prinzipiell möglich, doch dann kann man auch gleich XSL nehmen. (Viele Attribute/Eigenschaften in XSL sind zu CSS-Attributen kompatibel.)

Was HTML im Gegensatz zu XSL nicht kann: Definition von Seitenlayouts, automatische Seitenzahlen, u.a.

Da der Web-Service in Java entwickelt werden soll, ist es von Vorteil, wenn man den PDF-Erzeuger in Java einbetten kann (geht mit FOP u. UJAC-Print).

html2ps + ps2pdf dürfte zudem ziemlich langsam sein.

Trotzdem danke für den Hinweis. ;)
tar: Anlegen eines leeren Archivs wird feige verweigert.