(FOP + Ruby) / Rjb
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 ‘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






