xsl-fo, pages alternatives et contenu - XML/XSL - Programmation
Marsh Posté le 22-05-2009 à 01:00:40
Re,
Bon, j'ai fini par réussir exactement ce que je désirais avec fo:repeatable-page-master-alternatives ainsi que les balises fo:static-content
En gros :
1. un fo:static-content flow-name="xsl-region-before" avec tout mon contenu statique sur la page.
2. deux fo:simple-page-master, le premier nommé recto et le second nommé verso, qui déclarent chacun le fo:region-body et le fo:region-before.
3. un fo:page-sequence-master contenant un fo:repeatable-page-master-alternative contenant lui-même deux fo:conditional-page-master-reference. Le premier faisant référence au simple-page-master recto, le second faisant référence au simple-page-master verso. Enfin, chacun ayant la condition odd-or-even sur odd ou even, pour pouvoir alterner le design entre les pages paire et les pages impaires.
Il me reste un souci : lorsque je suis en multi-page, je dois afficher sur chaque page sauf la dernière une petite flèche ainsi qu'un index alphabétique qui indique que la page suivante est liée au même article. J'imagine que je vais devoir travailler avec les conditions, mais je ne vois pas encore très bien comment. Je ne me décourage pas, ça a déjà bien avancé.
a+
Marsh Posté le 27-05-2009 à 09:39:49
Tu t'es bien débrouille on dirait
Un petit exemple pour une manuel d'utilisateur en guise d'illustration de ta solution, ici on définit du recto verso en mode portrait et paysage.
|
J'ai pas bien capté ton souci, un petit exemple?
Marsh Posté le 27-05-2009 à 15:38:39
Pour mon souci, c'est bon, c'est réglé également, j'explique quand même :
J'ai un catalogue avec des "modèles". pour chaque modèle, une liste d'articles découlant du modèle, mais avec des specs différentes (taille, type de matériau, etc...).
Mon design de page accepte une liste jusqu'à 20 articles. Admettons maintenant que j'ai un modèle avec 200 articles. Je vais devoir générer un document xsl-fo qui va s'étendre sur plusieurs pages (10 pages). Lorsque j'ai du multi-page, je dois indiquer sur chaque page son index (a, b, c, d, etc...) ainsi qu'une indication visuelle pour que le lecteur se rende compte qu'il y a une page suivante concernant le même modèle.
En gros, mes 10 pages vont avoir des indices "courant" de "a" à "j". Sur les 9 premières pages, je dois afficher dans un coin une petite flèche (en image) qui sert d'indication visuelle, et à sa droite l'indice de la page suivante.
Page 1, j'aurai l'index courant "a", une flèche et l'indice "b" pour la page suivante.
Page 2, j'aurai l'index courant "b", une flèche et l'indice "c" pour la page suivante, etc...
La dernière page, quant à elle, n'aura que l'indice de page courant : "j".
Pour ce faire, j'ai utilisé les balises fo:marker et fo:retrieve-marker.
Dans ma partie "statique", je déclare des balises "fo:retrieve-marker" qui vont s'occuper de récupérer la valeur à inscrire, selon la page :
Code :
|
Mes 3 balises sont configurées pour récupérer la valeur des marqueur "index", "next" et "nextIndex", et ceci pour la page en cours.
Il ne me reste plus qu'a déclarer, sur chaque page, dans le contenu standard (fo:body) les marqueurs adéquats :
exemple pour la première page :
Code :
|
exemple pour la seconde page :
Code :
|
exemple pour la dernière page :
Code :
|
fop s'occupe de récupérer les données et les afficher correctement, pour chaque page. Il y a peut être un moyen plus propre de le faire, mais je n'ai pas trouvé autre chose, et ça me semblait assez adéquat pour résoudre mon problème.
Quant à ton exemple, voici le code que j'ai utilisé de mon côté (j'ai 2 versions différentes, une version papier et une version online, cette seconde n'ayant pas de différences entre les pages recto et verso :
Code :
|
Ensuite, selon que je dois générer le catalogue papier ou le catalogue online, je passe en tant que master-reference le masterName "papier" ou "online" dans la balise fo:page-sequence et le tour est joué.
Je dois encore alterner la valeur odd/even dans les conditions du page-sequence-master "papier", selon que mon article débute sur une page recto ou verso, mais ça c'est un autre problème qui est déjà implémenté dans mon système de génération ;-)
Vala, si ça peut aider quelqu'un tant mieux.
A+
Marsh Posté le 21-05-2009 à 13:59:12
Bonjour à tous !!
J'ai un tit problème de conception. Je ne cherche pas une solution clé en main, simplement quelques pistes pour arriver à mon but.
J'ai des données en base de données, que je récupère via php. Elles sont formattée avec une classe me retournant des fragments xml (xsl-fo) pour que j'arrive au final à un document passé à la moulinette via fop. J'obtiens en sortie un joli pdf, tout va bien. (je précise que ça fait 4 jours seulement que je fais du xsl-fo, suis encore un newbie)
Là ou ça se complique, c'est que l'ensemble des documents générés correspondent à un catalogue de produits. Ce catalogue présente à chaque fois un "modèle" avec 1 ou plusieurs articles découlant du modèle (spécifications techniques différentes pour chaque article). Qui dit catalogue dit pages recto-verso, et dans mon cas les marges sont différentes si c'est le recto ou le verso.
Second point complexe : chaque page contient un tableau d'articles. Si le nombre d'article pour un modèle spécifique est trop grand, je dois passer ce tableau sur une seconde page (du multi-pages, selon le nombre d'éléments...)
Je cherche des pistes à propos des points suivants :
1. lorsque le contenu doit passer sur plusieurs pages, pour chaque page il n'y a que le tableau qui change. J'aimerai, dans la mesure du possible, créer mon xsl-fo de manière à ce que toute la partie "hors" tableau soit définie pour toutes les pages... genre que ces éléments soient statiques sur toutes les pages d'un modèle.
2. Tous les éléments doivent être statique, mais je dois faire attention aux marges. Exemple : si c'est une page recto, la marge haute doit être de 3.5cm et la basse de 3cm. Si c'est une page verso, c'est l'inverse. Je dois également prendre en compte que chaque modèle ne commence pas forcément sur un recto. Le premier modèle d'une section sera toujours sur un recto. Mais si ce modèle s'étend sur 3 pages à cause du nombre d'article, alors le prochain modèle sera sur une page verso. C'est au niveau des modèles multi-pages que je me demande comment ça peut se gérer. J'ai vu qu'il y avait une balise "fo:repeatable-page-master-alternatives" et j'imagine que c'est de ce genre de chose dont j'aurai besoin, mais c'est au niveau de la mise en oeuvre que je coince un peu...
Pour le moment, le départ de mon xsl-fo est comme suivant :
Puis j'ai ensuite une série de block-container dont la plupart sont en position absolue et placé exactement ou je veux dans la page.
Maintenant j'aurai besoin de quelques conseils pour placer statiquement mes éléments sur plusieurs pages et permettre ces fameuses marges alternées.
D'avance merci pour vos suggestions.