Recommend Me


Mercredi 27 août 2008

(FOP + Ruby) / Rjb

Classé dans : Java, Projets, Ruby — greg @ 14:30

Je travaille en ce moment, dans le cadre de mon boulot, sur la mise en place d’une plateforme documentaire. L’idée étant d’être capable de générer de la documentation sous format HTML et PDF.

J’utilisais déjà FOP pour ce travail, mais en “solo”. Le besoin maintenant implique un travail d’équipe avec plusieurs rédacteurs, correcteurs, relecteurs… Nous avions déjà une XSL permettant de passer de XML vers FO, et on pourrait croire qu’un simple gestionnaire de version compléterait simplement cet existant pour permettre un travail de groupe.

Ce n’est pas aussi simple que cela. En effet, nous voulons que la documentation soit générée sur le serveur ou sont placés les documents XML. Facile direz vous. Oui, mais il faut en plus pouvoir contrôler comment se passe la “fabrication” des documents. Pouvoir les visualiser… Et même, pouvoir en corriger certaines parties, et cela, sans obliger ceux qui interviennent ponctuellement sur les documents (correcteurs, relecteurs en particulier) à ne pas être obligés de se plonger dans une syntaxe XML obscure et rebutante. Pour cela une petite interface Web est apparue comme une bonne solution. J’en reparlerai plus tard, mais nous avons même une solution simple permettant de modifier en WYSIWYG un fichier XML…

Venons-en au fait… Vous vous en doutiez, mais cette interface (et tout le reste de la plateforme) est faite en Ruby (je me demande bien avec quoi ?). Et très rapidement j’ai eu besoin de pouvoir générer les documents via FOP depuis des scripts Ruby. Pour cela RJB est mon ami. Voici ce que donne le source ExampleXML2PDF.java proposé par Apache une fois passé dans les mains du couple Ruby-RJB :

require ‘rubygems’
require ‘rjb’

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# export CLASSPATH=~/Downloads/fop-0.95/build/fop.jar:\
#   ~/Downloads/fop-0.95/lib/xmlgraphics-commons-1.3.1.jar:\
#   ~/Downloads/fop-0.95/lib/commons-logging-1.0.4.jar:\
#   ~/Downloads/fop-0.95/lib/commons-io-1.3.1.jar:\
#   ~/Downloads/fop-0.95/lib/avalon-framework-4.2.0.jar:\
#   ~/Downloads/fop-0.95/lib/batik-all-1.7.jar

class Fop
  def initialize( classpath = nil )
    # The ‘-Djava.awt.headless=true’ parameter is due to the "Can’t start the AWT" error on Mac.
    # I hope it do not affect others environments.
    Rjb::load( classpath, [‘-Djava.awt.headless=true’] )

    @jFile = Rjb::import( ‘java.io.File’ )
    @jFileOutputStream = Rjb::import( ‘java.io.FileOutputStream’ )
    @jBufferedOutputStream = Rjb::import( ‘java.io.BufferedOutputStream’ )

    # jTrasnformer = Rjb::import( ‘javax.xml.transform.Transformer’ )
    @jTransformerFactory = Rjb::import( ‘javax.xml.transform.TransformerFactory’ )
    # jSource = Rjb::import( ‘javax.xml.transform.Source’ )
    # jResult = Rjb::import( ‘javax.xml.transform.Result’ )
    @jStreamSource = Rjb::import( ‘javax.xml.transform.stream.StreamSource’ )
    @jSAXResult = Rjb::import( ‘javax.xml.transform.sax.SAXResult’ )

    @jFOUserAgent = Rjb::import( ‘org.apache.fop.apps.FOUserAgent’ )
    @jFopFactory = Rjb::import( ‘org.apache.fop.apps.FopFactory’ )
    @jMimeConstants = Rjb::import( ‘org.apache.fop.apps.MimeConstants’ )
    # jFop = Rjb::import( ‘org.apache.fop.apps.Fop’ )
  end
 
  def xml2pdf( xmlFile, xslFile, pdfFile )
   
    # Setup directories
    baseDir = @jFile.new( "." )
    outDir = @jFile.new( baseDir, "out" )
    outDir.mkdirs()
   
    # Setup input and output files
    xml = @jFile.new( baseDir, xmlFile )
    xslt = @jFile.new( baseDir, xslFile )
    pdf = @jFile.new( outDir, pdfFile )
   
    # configure fopFactory as desired
    fopFactory = @jFopFactory.newInstance( )
    foUserAgent = fopFactory.newFOUserAgent( )
   
    # Setup output
    out = @jFileOutputStream.new( pdf )
    out = @jBufferedOutputStream.new( out )
   
    # Construct fop with desired output format
    fop = fopFactory.newFop( @jMimeConstants.MIME_PDF, foUserAgent, out )
 
    # Setup XSLT
    factory = @jTransformerFactory.newInstance( )
    transformer = factory.newTransformer( @jStreamSource.new( xslt ) )
   
    # Set the value of a <param> in the stylesheet
    # transformer.setParameter( "versionParam", "2.0" )
   
    # Setup input for XSLT transformation
    src = @jStreamSource.new( xml )
   
    # Resulting SAX events (the generated FO) must be piped through to FOP
    res = @jSAXResult.new( fop.getDefaultHandler( ) )
   
    # Start XSLT transformation and FOP processing
    transformer.transform( src, res )
   
    # Close output file
    out.close( )
  end
end

if $0 == __FILE__
  fop = Fop.new
  fop.xml2pdf( "xml/pdf/index-pdf.xml", "xsl/XML2PDF.xsl", "doc.pdf" )
end

• • •

3 commentaires »

  1. [...] cela est en train de migrer vers Rake. Non seulement l’utilisation de FOPJava avec Ruby est très simple mais en plus cela nous permet de migrer tout un ensemble de scripts sous Ruby/Rake. En effet, nous [...]

    Ping par greg.rubyfr.net»Blog Archive » Documenter avec Ruby — Mardi 2 décembre 2008 @ 21:00
  2. [...] on Wed 04-3-2009 Strategic CSS is Management Driven Saved by LandCow on Tue 03-3-2009 (FOP + Ruby) / Rjb Saved by Mugen2004 on Wed 25-2-2009 made a change to the stylesheet but it’s not showing up… [...]

    Ping par Recent Links Tagged With "stylesheet" - JabberTags — Samedi 7 mars 2009 @ 11:34
  3. [...] the Content Query Web Part XSL to aggregate blog …>> saved by CommanderDK 30 days ago4 votes(FOP + Ruby) / Rjb>> saved by mfarley07 32 days ago3 votesHow we did yourself: PFGC.com — beget, accrual, and do [...]

    Ping par User links about "xsl" on iLinkShare — Vendredi 3 avril 2009 @ 4:03

RSS des commentairesTrackBack URI

Laisser un commentaire

You must be logged in to post a comment.

Powered by: WordPress • Template adapted from the Simple Green' Wench theme - RSS