obtenir un pdf a partir d'un XML - Divers - Programmation
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.
Marsh Posté le 05-09-2002 à 13:48:18
ReplyMarsh 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 ?
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.
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
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 ?
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 ...
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
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/
Marsh Posté le 05-09-2002 à 14:08:55
ok ok , je savais pas
bon je vais essayer de voir comment ca marche
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
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 ?
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
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
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 ?
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
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
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
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 !
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
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