vendredi 24 juillet 2009

Générer des document openXML Word 2003/2007

Les récents standards OpenXML et Open document permettent de générer des documents sans passer par des APIs propriétaires.

Pour comprendre les formats docx de word, rien de tel que l'exemple. Le contenu en clair du fichier s'observe en dézippant le fichier word (renommert son extension .docx en .zip). Ainsi il est possible d'étudier le contenu. Ce zip comporte plusieurs fichiers :

- word/document.xml : Comporte le contenu
- word/header1.xml, word/headerx.xml: Décrit les entêtes (par section)
- word/footer1.xml : Décrit les pieds de page
- word/styles.xml : Décrit les mises en forme

Les fichiers contenus dans le zip sont nombreux. Le fichier principal est le fichier document.xml.

A priori, l'édition de son contenu ne contient rien qui soit 'user friendly', par exemple :
<w:document>
<w:body>
<w:p w:rsidR="00047630" w:rsidRDefault="00047630">
<w:pPr>
<w:tabs>
<w:tab w:val="center" w:pos="7655"/>
<w:tab w:val="right" w:pos="15451"/>
</w:tabs>
<w:ind w:right="-29"/>
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:b/>
<w:bCs/>
<w:sz w:val="22"/>
<w:szCs w:val="22"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:b/>
<w:bCs/>
<w:sz w:val="22"/>
<w:szCs w:val="22"/>
</w:rPr>
<w:t>REGULATION :</w:t>
</w:r>
</w:p>
<w:tbl>
<w:tblPr>
<w:tblW w:w="0" w:type="auto"/>
<w:tblInd w:w="-68" w:type="dxa"/>
<w:tblLayout w:type="fixed"/>
...


Le principe de génération naturel est d'utiliser XSLT (XML Stylesheet Language Transformation) pour effectuer la transformation des données métiers brutes en un fichier document.xml.
(Toutefois, n'oubliez pas que les outils de transformation plus simple tel que Velocity peuvent être approprié dans le cas de traitement élémentaire (http://velocity.apache.org/))

Pour ne pas composer manuellement, le document.xml, mieux vaut l'extraire de votre document modèle et le copier/coller dans un fichier XSL reprenant la structure du document. Puis, en localisant endroits où ajouter les informations dans le fichier, on ajoute les valeurs de notre document XML.

Les balise XSL suivantes sont très utiles
<xsl:value-of select="/MyDoc/MyObject1/title"/> // Pour récupérer des valeurs simples

<xsl:for-each select="/MyDoc/MyObject2"> // Pour le parcours de collection

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:n2="urn:hl7-org:v3"
exclude-result-prefixes="n2 xs xsi xsl">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<w:document
xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
xmlns:w10="urn:schemas-microsoft-com:office:word"
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml">
<w:body>

...
...
...
</w:body>
</w:document>
</xsl:template>
</xsl:stylesheet>


Cette pratique présente un inconvénient, du fait de la création de ce fichier par un programme, le contenu est souvent excessivement verbeux et dénué de toute forme d'intelligence. Pour générer un fichier Word à partir d'une transformation XSL, il vaut mieux comprendre un minimum la logique de ce fichier. Comprendre les balise principales est utile


  • <w:p> : Sert à commencer un paragraphe
  • <w:pPr> : Définit les paramètres du paragraphe
  • <w:rPr> : Définit les paramètres applicables au mot. Un rPr peut-être définit au niveau du wPr Lorsqu'il concerne tous les mots du paragraphe ou dans w:r lorsqu'il concerne un mot seulement
  • <w:tabs> : Permet de définir les différentes tabulations dans une paragraphe
  • <w:r> : Définit un groupe de mots
  • <w:t> : Définit un mot
  • <w:tab> : Insère une tabulation
  • <w:tbl> : Une table
  • <w:tr> : Une ligne (table row)
  • <w:tc> : Une colonne (table column)
  • <w:b> : Met le texte en gras
  • <w:u> : Souligne le texte (Attention il faut préciser le type de soulignement)
  • <w:customXml element='??'> : Est une balise qui permet de définir des structures de XML comme des information cachées, c'est utile pour structurer le document de manière invisible.


Une fois que le document est constitué, il suffit de refaire un zip et de renommer l'extension .zip en .docx. Si vous compressez l'OpenXML à l'aide de java, il faut faire attention à ce que les entries utilise le caractère '/' et non pas '\', autrement le fichier ne pourra être ouvert par la suite OpenOffice.

Aucun commentaire: