XML FO-Processor

Hallo,

ich habe ein Java-Programm geschrieben, dass aus verschieden XML-Dateien ein XML-Dokument erzeugt, dass ich dann in HTML und PDF umgewandeln möchte. Die Umwandlung in HTML ist mit XSLT in demselben Java-Programm problemlos möglich. Ich habe schon herausgefunden, dass ich für die Erzeugung des PDFs den Umweg über XML FO gehen muss und dass der einzige bereits implementierte FO Processor der von org.apache.fop zu sein scheint. Die Erzeugung des FO-Dokuments ist ebenfalls kein Problem.

Nun scheitere ich am FO-Processor. Am liebsten hätte ich ganz simpel eine Menge von JARs, die ich in mein bereits vorhandenes Programm einbinde und noch ein paar Code-Zeilen dazu schreibe und fertig. Aber so einfach scheint es nicht zu sein. Ich habe mir Sources und erforderliche JARs aus dem aktuellen org.apache.fop kopiert, aber irgendwie fehlt da immer was. Ich habe mehrmals gelesen, dass man das Apache-FOP in eine bestehende Anwendung einbinden kann, wie ich das will, aber mir erschließt sich einfach nicht, wie das funktionieren soll.

Ich hoffe, Ihr könnt mir weiterhelfen.

Danke!
Schnoof

Mein JAR konnte ich inzwischen erzeugen.

Den Beispielcode, den ich gefunden habe, kann ich damit aber nicht anwenden. Das muss eine andere Version haben. Ich habe kein weiteres Beispiel zur Einbindung in ein eigenes Java-Programm gefunden.

Jetzt spiele ich erst mal mit der mitgelieferten fop.bat rum und habe feststellen müssen, dass die Hälfte in dem erzeugten FO-Dokument fehlt. Wenn ich das XML in FO transformiere, erhalte ich eine Validation Exception (FORG0001: Cannot convert string „common“ to a double).

Ich wüsste aber nicht, dass ich an irgendeiner Stelle einen String „common“ in double konvertieren möchte. Es kommt ja nicht mal das Wort „common“ vor. Das Fo-Dokument bricht mitten bei der Erzeugung einer neuen Tabellenzeile ab:

Dann ist das Dokument zu Ende. Das ist im dazugehörigen XSLT mitten in einer Schleife:


    rgb(221, 221, 221)rgb(219, 236, 210)line-through (outdated) ( only)YesNo


Wie kann ich das beheben bzw. wie finde ich raus, woran es nun genau liegt?

Danke
Schnoof

Hallo,

Den Beispielcode, den ich gefunden habe, kann ich damit aber
nicht anwenden. Das muss eine andere Version haben.

Welche Version nutzt du?

Ich habe
kein weiteres Beispiel zur Einbindung in ein eigenes
Java-Programm gefunden.

http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/e…

http://xmlgraphics.apache.org/fop/0.94/embedding.html

Gruß
Heavy

Hallo Schnoof,

du hattest geschrieben ich muss fo einsetzen, aber: Es gibt eine Alternative zu fo: iText.

http://www.lowagie.com/iText/

Das ist eine freie Java Bibliothek um pdf Dokumente zu generieren. Ich verwende die Bibliothek zwar unter c#, aber bis jetzt bin ich sehr zufrieden und kann sie daher nur empfehlen. es gibt auch deutsche Seiten dazu, hab ich aber gerade nicht gefunden …

Fo hatte ich mal angefangen, das war mir aber zu kryptisch, obwohl ich schon mit xslt Seiten aus xml in HTML transformiert habe. Also zumindest Grundkenntnisse waren vorhanden :wink:

mfg und Frohe Weihnachten

Dirk.Pegasus

hi schnoof,

wenn du schon html hast, wieso kannst du dann FO ‚as it is‘ nicht benutzen um pdf-s zu erzeugen?

also zb. an der kommandozeile:
java -Xmx240m -jar fop.jar -d -fo .fo .pdf

…und zuvor erzeugst du das .fo über xslt…

entweder ich verstehe dein problem nicht oder du machts dir zuviele gedanken weil du zuviel ahnung (java… :wink: hast.

stefan

hi dirk,

ich kenne leute, die sind über iTextSharp fast wahnsinnig geworden. das was man unter fop geschenkt kriegt muss man sich da kompliziert zusammenzupfen. geht schon damit los, dass man einmal erstellte zb. tablerows und deren content(bytes) nicht mehr rankommt.

  • oder war ich einfach zu doof?

wie machst du zb. inhaltsangaben? produzierst du da erst mal alle seiten raus um die seitenzahl eine zb. kapitels zu wissen?

komische welt, denn ich fand das mit fo echt easy…im zweifelsfall bin ich aber lieber ein transformation-stylesheeter anstatt coder.

grüsse,

stefan

hi schnoof,

nur noch als hinweis, du weisst, dass es zig kommerzielle fo-prozessoren gibt, die z.t. einen erheblich grösseren funktionsumfang haben als fop?

zb. von antenna house (google ist dein freund :wink:

stefan

hi schnoof,

wenn du schon html hast, wieso kannst du dann FO ‚as it is‘
nicht benutzen um pdf-s zu erzeugen?

Der Hintergrund ist der, dass wir letztlich unsere Doku parallel zum Quellcode pflegen wollen. Das Build-Skript, dass unsere Releases erstellt, soll dabei gleich mal die passende Doku generieren und mit dem Release zusammen ablegen.

also zb. an der kommandozeile:
java -Xmx240m -jar fop.jar -d -fo .fo
.pdf

Wenn ich mein FO-File kriege, werde ich mal gucken, ob das funktioniert.

…und zuvor erzeugst du das .fo über
xslt…

Das krieg ich ja derzeit irgendwie nicht hin, bricht einfach mit einer nichtssagenden Meldung ab.

entweder ich verstehe dein problem nicht oder du machts dir
zuviele gedanken weil du zuviel ahnung (java… :wink: hast.

Tja … :o) Wollte halt das FOP nicht installieren. Aber wenn man das Build-Skript aufruft, wird ja tatsächlich erst mal die fop.jar erzeugt. Die hatte ich zu Beginn ja noch nicht und fragte mich, wie das dann funktionieren soll. Aber nun muss ich erst mal sehen, wie ich das FO erzeuge. Irgendwo muss ein kleiner Fehler sein, der mir schlicht nicht auffällt.

Bis denne
Schnoof

Ich habe
kein weiteres Beispiel zur Einbindung in ein eigenes
Java-Programm gefunden.

http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/e…

http://xmlgraphics.apache.org/fop/0.94/embedding.html

Manchmal ist es so einfach … Danke!

Jetzt müsste ich nur noch herausfinden, warum ich mein FO-Dokument nicht erzeugen kann. Irgendwo hakt’s und ich weiß nicht wo.

Bis denne
Schnoof

huhu,

Der Hintergrund ist der, dass wir letztlich unsere Doku
parallel zum Quellcode pflegen wollen. Das Build-Skript, dass
unsere Releases erstellt, soll dabei gleich mal die passende
Doku generieren und mit dem Release zusammen ablegen.

du weisst, dass du mit dem saxon8.xy und xslt2.0 auch textdoc-s (zb. deinen quellcode) nach xml transformieren kannst? und dasss das ganze auch mit mehreren input-docs geht?

also zb. an der kommandozeile:
java -Xmx240m -jar fop.jar -d -fo .fo
.pdf

Wenn ich mein FO-File kriege, werde ich mal gucken, ob das
funktioniert.

das sollte es. womöglich bekommst du warnungen, weil der fop zb. kein table-layout=„auto“ etc. veträgt.

…und zuvor erzeugst du das .fo über
xslt…

Das krieg ich ja derzeit irgendwie nicht hin, bricht einfach
mit einer nichtssagenden Meldung ab.

mmh, das hatte ich bisher falsch verstanden, dann ists ja gar kein problem von fop sondern deiner transformation nach fo (woraus du dann mit fop pdf machst).

entweder ich verstehe dein problem nicht oder du machts dir
zuviele gedanken weil du zuviel ahnung (java… :wink: hast.

mmh, ein buischen stehe ich noch immer im wald…ich guck mir dein ausgangsposting nochmal an (so weit ich mich erinnere gabs doch da was ion der stack wo tatsächlich fop-meldungen kamen?

also: kommen die fehler bei der trafo xml -> fo oder erst bei fo -> pdf?

Tja … :o) Wollte halt das FOP nicht installieren.

musst du auch nicht, ich schmeiss immer als jar’s (da kennst du dich bessser aus) die der saxon noch braucht in das verzeichnis wo meine xml-s liegen und ab …

man das Build-Skript aufruft, wird ja tatsächlich erst mal die
fop.jar erzeugt. Die hatte ich zu Beginn ja noch nicht und
fragte mich, wie das dann funktionieren soll.

mmh, ich glaube, jetzt ists schade dass ich doch kaum java kenntbnisse habe…ich stehe jetzt nämlich noch mehr im wald…das liest sich, als würdest du nicht nur xml -> fo -> pdf sytlesheet trafos machen sondern auch noch nebenher den fop kompilieren oder neu schreiben oder wie? muss das sein?

ciao,

stefan

Hallo Stefan,

vielen Dank. Das läßt ja hoffen … Tatsächlich hab ich da auch schon ein paar „Klippen“ entdeckt. Zum Inhaltsverzeichnis: Hab ich noch nicht probiert, dürfte aber „einfach“ sein, da Ich bookmarks bereits setze und das wohl die Basis dafür ist.

Da ich aber kein Dogmatiker bin: Wo kann ich nachlesen, wie ich unter c# und ggfs. mit welchen Server Erweiterungen (MS-IIS ist für mich Pflicht) per fo ein Dokument generiere. Das Erstellen des xsl:fo selber ist nicht (noch nicht …) das Thema. Der Prozess: „Ich habe ein xml, ein xsl:fo und nun schwups ein pdf“ ist mir (leider) nicht klar.

Eine Idee?

mfg

Dirk.Pegasus

hallo dirk,

ein gutes neues :wink:

vielen Dank. Das läßt ja hoffen … Tatsächlich hab ich da
auch schon ein paar „Klippen“ entdeckt. Zum
Inhaltsverzeichnis: Hab ich noch nicht probiert, dürfte aber
„einfach“ sein, da Ich bookmarks bereits setze und das wohl
die Basis dafür ist.

ich bin gespannt … und skeptisch…lass’ mal hören, wie gut das mit ITextSharp so läuft…

Da ich aber kein Dogmatiker bin: Wo kann ich nachlesen, wie
ich unter c# und ggfs. mit welchen Server Erweiterungen
(MS-IIS ist für mich Pflicht) per fo ein Dokument generiere.
Das Erstellen des xsl:fo selber ist nicht (noch nicht …) das
Thema. Der Prozess: „Ich habe ein xml, ein xsl:fo und nun
schwups ein pdf“ ist mir (leider) nicht klar.

naja, ich bin erschütternd ignorant, was client-sever technologien angeht.
aber über javascript kannst du doch aus einem html eine xslt-transformation anstossen, und dabei den pfad zum xml-in, xml-out und xslt übergeben.

und nochmal (s.o. mein beitrag zu schnoof): die namespace xsl:fo kannst du gerne definieren. xml ist da ja sehr genduldig :wink:

worauf ich so sybillinisch hinweisen will: eine fo-transformation ist eine trafo von xml nach xml. bei dir und schnoof liest sich das immer, als wärs etwas besonderes und man bräuchte schon zur erzeugung eine fo-docs etwas spezielles - stimmt nicht!
…nur, dass im fo-xml-doc zb. sowas vorkommt:

sprich, du schreibst bei deiner xslt-trafo nur so nette knaben mit dem fo:-prefix in den output stream…wenn diese dann dem fo-schema entsprechen kannst du sie mit einem fo-parser nach pdf transformieren. natürlich hängen die details dann wieder mal vom parser ab, über die einschränkungen von fop s.o., und ich kenne noch den von antenna house, der ist mächtig…und genauso (mächtig) teuer…

so long & hth,

stefan

Ich hol mal etwas mehr aus:

Wir produzieren Software und mein Team will demnächst eine bessere Doku-Generierung dafür. Jedes unserer Software-Projekte hat ein Build-Skript. Und demnächst soll es auch ein Doku-Verzeichnis mit XML-Dateien haben. Wenn wir dann Änderungen an der Software machen, die wir dokumentieren wollen, pflegen wir gleich diese XML-Dateien. Und aus diesen XML-Dateien wollen wir HTML und PDF erzeugen. Und wenn ein Projekt auf ein anderes Projekt zurückgreift, dann (jetzt kommt der Clou) sollen bestimmte Doku-Kapitel aus diesem anderen Projekt mit in die Doku eingebunden werden.

Und erst dachte ich, die Einbindung vom FOP wäre ein ganz großes Problem, die Erzeugung des FO-Dokuments hingegen gar kein Problem. Dann stellte ich aber fest, dass die Einbindung wohl eher gar kein Problem ist, ich nur die richtige Doku noch finden muss, die Erzeugung des FO-Dokuments hingegen problematischer zu sein scheint. In meiner ersten Antwort zu meinem Ausgangsposting findest du die Auszüge, die scheinbar zum Fehler führen.

Ich glaube, das wird mich noch ein bisschen beschäftigen. :o)

In meiner ersten Antwort zu meinem Ausgangsposting findest
du die Auszüge, die scheinbar zum Fehler führen.

http://www.wer-weiss-was.de/cgi-bin/forum/showarchiv…

Bis denne und danke!
Schnoof

Oder kann es sein, dass die Transformation abbricht, weil das Dokument
zu lang wird? Ich nutze den javax.xml.transform.Transformer.

Eben habe ich nämlich auf der Titelseite des Dokuments noch Graphiken
eingefügt, nun ist die XSL-Datei ein paar Zeilen länger und das
Transformationsergebnis wird natürlich auch länger. Nun bricht der
Transformator prompt schon ein bisschen vorher ab, nämlich mitten in
der Tabellenzeile vor dem zuvorigen Ende:

nameYesinterfaceName of the interface as configured at the

Ich weiß, da kommen etwas wenig Zeilenumbrüche raus, im XSL-Dokument
sind eigentlich weitaus mehr enthalten.

Wie krieg ich das hin?

Danke
Schnoof

Vielleicht sollte ich jetzt das Brett wechseln?
Das letzte Zeichen in der erzeugten Fo-Datei ist das 40960. Zeichen. Gibt es irgendwas, was eine Datei oder einen Puffer auf 40960 Zeichen begrenzt?

Danke
Schnoof