obtenir un pdf a partir d'un XML

obtenir un pdf a partir d'un XML - Divers - Programmation

Marsh Posté le 05-09-2002 à 13:40:46    

voila je dois generer un pdf a partir d'un XML, je suis donc passer par le html (en faisant un fichier XSL), mais o surprise apres avoir utilise HTML2PDF, mes tableaux ne sont plus la, mes images non plus, g plus rien (gras, souligne italique)
il me met un warning a chaque fois qu'il trouve une balise HTML
 
je peux faire comment pour avoir un pdf a partir d'un xml ?
(si y'a moyen d'eviter de passer par un parseur type DOM sous php ben je suis preneur :)
 

Reply

Marsh Posté le 05-09-2002 à 13:40:46   

Reply

Marsh Posté le 05-09-2002 à 13:42:32    

Ben au lieu de generer du html tu fais du xsl:fo et tu fais le pdf par fop par exemple. Ou alors voir du coté de docbook peut-etre.

Reply

Marsh Posté le 05-09-2002 à 13:47:06    

xsl:fo,  :??:  c koi ca ?

Reply

Marsh Posté le 05-09-2002 à 13:48:18    

Reply

Marsh Posté le 05-09-2002 à 13:50:47    

je sais, c deja fait :)
thx je look ca.

Reply

Marsh Posté le 05-09-2002 à 13:55:58    

mais petite quesion comme ca en passant, avec ca je pourrai genrer un pdf "en tps reel" pq c pour un site web ca, donc fo que ca puisse se faire en ligne, c bon ou pas ?

Reply

Marsh Posté le 05-09-2002 à 13:57:42    

mmmh, ca depends combien de temps tes utilisateurs peuvent attendre... Ca risque d'être trop lent a mon avis.

Reply

Marsh Posté le 05-09-2002 à 13:59:10    

c'est a dire ?
pq en fait c pour generer une facture en pdf donc au pire y'aura vraiment o pire 4-5 pages

Reply

Marsh Posté le 05-09-2002 à 14:04:01    

J'avais des documents relativement simple d'une vingtaine de pages, il fallait bien 10 secondes pour le génerer. Par contre tu peux peut-etre l'envoyer par mail, non ?

Reply

Marsh Posté le 05-09-2002 à 14:04:11    

swich a écrit a écrit :

c'est a dire ?
pq en fait c pour generer une facture en pdf donc au pire y'aura vraiment o pire 4-5 pages
 




c'est surtout en nombre d'accès simultané à ton site qu'il faut compter ...

Reply

Marsh Posté le 05-09-2002 à 14:04:11   

Reply

Marsh Posté le 05-09-2002 à 14:05:31    

bah 10 s pour 20 pages, ca fait 2s pour une page, c bon ca me va :)
et en plus oui je dois l'envoyer par mail
 
par contre ce qui est chiant c tout en anglais, pas une seule expli ou tuto en french :(

Reply

Marsh Posté le 05-09-2002 à 14:07:43    

swich a écrit a écrit :

bah 10 s pour 20 pages, ca fait 2s pour une page, c bon ca me va :)
et en plus oui je dois l'envoyer par mail




 
Faut pas compter comme ca, y'a le temps de lancement qui est fixe... Et qui s'ajoute au temps de géneration du source FO et de la génération pdf...  
 
Par contre si tu l'envoie par mail c'est pas un probleme, tu peux le faire tourner en tâche de fond.
 
Edit: s/pas mail/par mail/


Message édité par lorill le 05-09-2002 à 14:09:49
Reply

Marsh Posté le 05-09-2002 à 14:08:55    

ok ok , je savais pas :)
bon je vais essayer de voir comment ca marche  :sweat:  

Reply

Marsh Posté le 05-09-2002 à 14:28:21    

euu ptite question comme ca en passant, en fait le xslFO remplace le xsl, mais comment lier le xml et xslfo, c pas dit ds le tuto

Reply

Marsh Posté le 05-09-2002 à 14:30:23    

swich a écrit a écrit :

euu ptite question comme ca en passant, en fait le xslFO remplace le xsl, mais comment lier le xml et xslfo, c pas dit ds le tuto




 
Ben comme tu transformais ton xml en html, par xslt a priori. C'est pas comme ca que tu faisais ?

Reply

Marsh Posté le 05-09-2002 à 14:35:55    

ben qd je veux afficher mon xml je mettais ds mon xml :
<?xml-stylesheet href="affichage_devis.xsl" type="text/xsl ?>  
 et ds mon xsl je faisais des trucs dans le genre :  
<xsl:value-of select="taille"/>  
mais la g rien vu qui ressemble a ca ds le xslFO

Reply

Marsh Posté le 05-09-2002 à 14:40:57    

XSL comporte deux volets bien distincts : XSLT pour les transformation et XSLFO pour les formatting objects (la présentation quoi). XSLFO c'est une application XML donc c'est un fichier XML avec des balises compréhensible pour un parser FO qui doit présenter le contenu. Comme il n'existe toujours pas on utilise FOP pour convertir le FO en PDF, ainsi on peut voir le résultat avec par exemple Acrobat Reader.  
 
En clair, tu dois écrire un stylesheet XSL qui transforme ton XML initial en (XML pour) FO, ensuite tu présente ce fichier à FOP qui produira le PDF équivalent.  
 
Bon travail! Avander


Message édité par avander le 05-09-2002 à 14:42:25

---------------
A thing of beauty is a joy forever (John Keats)
Reply

Marsh Posté le 05-09-2002 à 14:42:54    

waouuuu, ca a l'air cho a faire qd meme, non?
ou c le debut qui est galere est apres ca va mieu ?

Reply

Marsh Posté le 05-09-2002 à 14:51:04    

Il faut bien comprendre la structure et la hiërarchie des FO, après c'est un stylesheet à développer ( pas plus compliqué que de transformer du XML en HTML :-).
 
Voici qq liens pour te mettre sur la bonne voie :
http://www.xml.com/pub/a/2001/01/17/xsl-fo/index.html
http://www.xml.com/pub/a/2001/01/24/xsl-fo/
 
http://www.xml.com/pub/a/2002/03/20/xsl-fo.html
 
Avander


Message édité par avander le 05-09-2002 à 14:54:58

---------------
A thing of beauty is a joy forever (John Keats)
Reply

Marsh Posté le 05-09-2002 à 14:56:07    

ok merci bien je vais regarder ca

Reply

Marsh Posté le 05-09-2002 à 15:21:26    

qq'un peut il me faire un ptit exemple avec ca (juste avoir un tablo)
si mon fichier xml fait :
<rep>
   <contact>  
    <nom>to</nom>
    <prenom> to </prenom>
   </contact>
<contact>  
    <nom>ti</nom>
    <prenom> ti </prenom>
   </contact>
<contact>  
    <nom>ta</nom>
    <prenom> ta </prenom>
</contact>
</rep>
 
et mon xsl :
 
<table>
<xsl:for-each select="rep">
<tr>
<td> <xsl:value-of select="nom"/> </td>
<td> <xsl:value-of select="prenom"/> </td>
</tr>
</xsl:for-each>
</table>
 
pour avoir le meme avec xslFO ...
pq la je capte pas vraiment le truc :(
 

Reply

Marsh Posté le 05-09-2002 à 17:11:18    

J'ai fait un stylesheet pour ton exemple, est-ce qu'il y moyen de te faire parvenir ces fichiers autrement qu'en les déversant directement sur le forum pcq. c'est assez long et je veux pas m'attirer les foudres des modérateurs...
 
Avander


---------------
A thing of beauty is a joy forever (John Keats)
Reply

Marsh Posté le 05-09-2002 à 17:27:04    

bha ouais mais en même temp je suis assez curieux moi. Je pense pas que ca dérange les modos ... et puis c'est charte compliant ! ;)

Reply

Marsh Posté le 06-09-2002 à 08:46:30    

-> avander  
va voir tes messages perso
:)

Reply

Marsh Posté le 06-09-2002 à 10:14:13    

Pour les curieux ;-) et pour la bonne cause voici d'abord le xml qui reprend l'exemple donné par swich :
 
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<rep>
  <contact>
   <nom>to</nom>
   <prenom> to </prenom>
  </contact>
<contact>
   <nom>ti</nom>
   <prenom> ti </prenom>
  </contact>
<contact>
   <nom>ta</nom>
   <prenom> ta </prenom>
</contact>
</rep>
<!-- eof -->
 
Le stylesheet qui va transformer cela en FO (attention les yeux c'est un peu long!) :
 
<?xml version='1.0' encoding="ISO-8859-1"?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
  xmlns:fo="http://www.w3.org/1999/XSL/Format">
 
  <xsl:output method="xml" encoding="ISO-8859-1"/>
 
 
  <xsl:template match="/">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
 
      <fo:layout-master-set>
 
        <!-- description des types de pages (ex. première, gauche et droite) -->
        <fo:simple-page-master master-name="cover"
            page-height="29.7cm" page-width="21cm"
            margin-top="1cm" margin-bottom="1cm"
            margin-left="2.5cm" margin-right="2.0cm">
          <fo:region-body/></fo:simple-page-master>
        <fo:simple-page-master master-name="left"
            page-height="29.7cm" page-width="21cm"
            margin-top="1cm" margin-bottom="0cm"
            margin-left="2.0cm" margin-right="2.5cm">
          <fo:region-before extent="1cm"/>
          <fo:region-body margin-top="1.1cm" margin-bottom="2.1cm"/>
          <fo:region-after extent="2cm"/></fo:simple-page-master>
        <fo:simple-page-master master-name="right"
            page-height="29.7cm" page-width="21cm"
            margin-top="1cm" margin-bottom="0cm"
            margin-left="2.5cm" margin-right="2.0cm">
          <fo:region-before extent="1cm"/>
          <fo:region-body margin-top="1.1cm" margin-bottom="2.1cm"/>
          <fo:region-after extent="2cm"/></fo:simple-page-master>
 
        <!-- description de la sequence des pages -->
        <fo:page-sequence-master master-name="contents" >
        <fo:repeatable-page-master-alternatives>
            <fo:conditional-page-master-reference master-name="left" odd-or-even="even"/>
            <fo:conditional-page-master-reference master-name="right" odd-or-even="odd"/></fo:repeatable-page-master-alternatives></fo:page-sequence-master></fo:layout-master-set>
 
      <!-- definition des flots de texte -->
      <fo:page-sequence master-name="contents" initial-page-number="1" language="fr">
 
        <!-- entête de page -->
        <fo:static-content flow-name="xsl-region-before">
          <fo:table>
            <!-- 2do: generate these automatically! -->
            <fo:table-column column-width="10cm"/>
            <fo:table-column column-width="5cm"/>
            <fo:table-body>
              <fo:table-row>
                <fo:table-cell>
                  <fo:block font-family="Helvetica" font-size="8pt" text-align="start">
                    XSL-FO quickie!</fo:block></fo:table-cell>
                <fo:table-cell>
                  <fo:block font-family="Helvetica" font-size="8pt" text-align="end">
                    Avander</fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:static-content>
 
        <!-- pied de page -->
        <fo:static-content flow-name="xsl-region-after">
          <fo:block font-family="Helvetica" font-size="8pt" text-align="center" space-before.optimum="10pt" space-after.optimum="1pt">
            <fo:leader leader-pattern="rule" rule-thickness="1pt" leader-length="100%"/></fo:block>
          <fo:table>
            <!-- 2do: generate these automatically! -->
            <fo:table-column column-width="6cm"/>
            <fo:table-column column-width="4cm"/>
            <fo:table-column column-width="6cm"/>
            <fo:table-body>
              <fo:table-row>
                <fo:table-cell>
                  <fo:block font-family="Helvetica" font-size="8pt" text-align="start">
                    zRep<xsl:text>.pdf</xsl:text></fo:block></fo:table-cell>
                <fo:table-cell>
                  <fo:block font-family="Helvetica" font-size="8pt" text-align="center">
                    <xsl:text>- </xsl:text>
                    <fo:page-number/>
                    <xsl:text> -</xsl:text></fo:block></fo:table-cell>
                <fo:table-cell>
                  <fo:block font-family="Helvetica" font-size="8pt" text-align="end">
                    <xsl:text>Dernière mise à jour : 05/09/2002</xsl:text></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:static-content>
 
        <!-- corps de page -->
        <fo:flow flow-name="xsl-region-body">
 
          <xsl:apply-templates/></fo:flow></fo:page-sequence></fo:root></xsl:template>
 
<!-- debug only : flags all elements without template -->
  <xsl:template match="*">
    <fo:block>
      <xsl:text>???</xsl:text>
      <xsl:apply-templates/></fo:block></xsl:template>
 
<!-- blocks -->
  <xsl:template match="rep">
    <fo:table space-after.optimum="10pt">
      <!-- 2do: generate these automatically! -->
      <fo:table-column column-width="8cm"/>
      <fo:table-column column-width="8cm"/>
      <fo:table-body>
 
        <xsl:apply-templates/></fo:table-body></fo:table></xsl:template>
 
 
  <xsl:template match="contact">
    <fo:table-row>
      <xsl:apply-templates/></fo:table-row></xsl:template>
 
 
  <xsl:template match="nom|prenom">
    <fo:table-cell border-width="1px" border-style="solid" >
      <fo:block font-size="10pt" font-family="Times-Roman" vertical-align="top">
 
        <xsl:value-of select="."/></fo:block></fo:table-cell></xsl:template>
 
</xsl:stylesheet>
<!-- eof -->
 
Après transformation du xml par le stylesheet vous obtenez du FO ( càd. un fichier xml qui décrit la présentation à l'aide de formatting objects). Pour voir à quoi cela ressemble on convertit généralement le fichier FO en PDF avec l'application FOP.  
 
Désolé, les smilies c'était pas prévu!
Avander


Message édité par avander le 06-09-2002 à 10:15:30

---------------
A thing of beauty is a joy forever (John Keats)
Reply

Marsh Posté le 06-09-2002 à 11:05:31    

lol les smiley ds le code
 :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed