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

• • •

Mardi 26 août 2008

La couleur de l’Ajax…

Classé dans : AJAX, Projets, Ruby, Web, bivouac — greg @ 18:44

Dans un post du mois d’aout, Nicolas disait voir rouge… Et bien j’aime la couleur !

Dans un autre poste, plus ancien, Sunny nous proposait de redécouvrir cursor:progress.

Et bien je me suis amusé à marier les deux via un plugin Bivouac (non encore disponible) :

Ajax::Responders.register( {
  :on_create => function {  
    e = $class-(‘body’)
    e.first().addClassName(‘loading’)
  },
  :on_complete => function {
    if Ajax[:activeRequestCount] == 0
      e = $class-(‘body’)
      e.first().removeClassName(‘loading’)
    end
  }
} )
• • •

Fin des vacances…

Classé dans : Famille, Friend, Important, Photo, Tout et rien — greg @ 0:15

Et ce fut le grand retour au boulot… Quoi qu’il en soit, ce temps de repos fut fort agréable…

Je ne suis pas de nature à vous montrer des photos de tonton DD à la plage ou la cousine Berth mangeant une galette à la crêperie du port, mais voici tout de même une petite sélection de photos prises cet été.



Bonne reprise à tous.

• • •

Samedi 2 août 2008

Exemple ProtoChart’s Tent…

Classé dans : Uncategorized — greg @ 15:21

Le blog deensoft propose un petit tutoriel d’utilisation de ProtoChart.

J’ai fait quelques corrections dans le plugin ProtoChart’s Tent. Voici le code à utiliser dans votre vue Bivouac pour obtenir le même résultat.

  1. #
  2. #  Project ProtoChartTest
  3. #
  4. #  Created using bivouac on Thu Jul 31 19:35:10 +0200 2008.
  5. #  Copyright (c) 2008 __My__. All rights reserved.
  6. #
  7.  
  8. module ProtoChartTest::Views
  9.   def pc_test
  10.     h1.header { "ProtoChart’s Tent example" }
  11.  
  12.     div :id => "chart", :style => "width:500px;height:300px"
  13.    
  14.     protochart( "chart",
  15.       "Ajaxian" => [[1, 996], [2, 1162], [3, 102], [4, 491], [5, 75]],
  16.       "Ajax" => [[1, 307], [2, 2184], [3, 436], [4, 304], [5, 152]],
  17.       :xaxis => {
  18.         :min => 0,
  19.         :max => 6,
  20.         :ticks => [
  21.           [0, ""],
  22.           [1, "Good"],
  23.           [2, "All"] ,
  24.           [3, "Avg Month"],
  25.           [4, "Great"],
  26.           [5, "Best"],
  27.           [6, " "]
  28.         ]
  29.       },
  30.       :legend => { :show => true },
  31.       :points => { :show => true },
  32.       :lines => { :show => true }
  33.     )
  34.    
  35.   end
  36. end
  37.  
• • •

Vacances

Classé dans : Important, Musique, libre — greg @ 14:48

Ça y est, je suis enfin en vacances pour trois semaines… J’en profite pour vous faire écouter ce qui va bercer mes trajets vers la plage…

• • •

Jeudi 31 juillet 2008

ProtoChar’s Tent

Classé dans : Camping, Projets, Ruby, bivouac — greg @ 18:51

Je viens de pousser, dans le repository de Bivouac, le plugin ProtoChart’s Tent.

Ce plugin utilise ProtoChart afin de faciliter la création de graphiques comme celui ci :

• • •

Mercredi 30 juillet 2008

Backpack 0.3.0

Classé dans : Camping, Projets, Ruby, bivouac — greg @ 1:20

La version 0.3.0 de Backpack, le générateur de (squelette de) plugins pour Bivouac, est en ligne. Elle n’apporte que quelques corrections mineures de bugs.

• • •

Mardi 29 juillet 2008

Bivouac 0.4.0ß

Classé dans : Camping, Projets, Ruby, bivouac — greg @ 19:19

La version 0.4.0ß est disponible sur mon serveur gem de développement. Elle nécessite la version 1.9.1 de Camping, disponible également sous forme de gem sur mon serveur.

# gem install camping –source=http://dev.rubyfr.net
# gem install bivouac –source=http://dev.rubyfr.net

Une fois la nouvelle version installée, n’oubliez pas de mettre à jour vos projets :

$ rake bivouac:update:all
• • •

Samedi 26 juillet 2008

myisamchk

Classé dans : Blogroll, Important — greg @ 13:40

Ce matin (vers 14h) en me réveillant, j’ai eu la désagréable surprise de me retrouver face à un odieux message sur ce site me signalant qu’une des mes tables MySQL “is marked as crashed and should be repaired”

Si vous rencontrez ce type de problème, pas de panique, c’est très simple à résoudre avec l’outil myisamchk :

# myisamchk -r -q /var/lib/mysql/base/table.MYI
• • •

Vendredi 25 juillet 2008

Live Validation 1.0.0

Classé dans : Camping, Projets, Ruby, bivouac — greg @ 17:43

Je viens de mettre en ligne la version 1.0.0 du plugin live_validation pour Bivouac

Ce plugin permet de faire de la validation de contenu de champ de formulaires en utilisant la librairie livevalidation_prototype.js.

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