Bonjour à tous !
Je n'arrive pas à trouver de solutions sur le web à mon problème, donc j'en conclu qu'il y a de grandes chances que ma façon de faire soit la mauvaise
Contexte:
Je génére un PDF à partir d'un XML via FOP v0.95. Pour celà j'ai écrit ma jolie feuille de style XSL-FO qui marche plutot bien pour l'instant.
Le PDF contient des fiches et sur chaque fiche il y a tout un paquet d'informations, et surtout une carte à la fin de la fiche.
TOUT les éléments graphiques sont en SVG ! Le problème touche les cartographies uniquement (les décoration de titre on s'en fiche).
Une carto est composée de:
- 1 fond de carte issu d'une image JPG importée dans le svg par la balise <svg:image>
- un ou plusieurs secteurs ou points remarquables dessinés sur le fond de carte toujours en SVG.
Comme il s'agit de cartographie, l'image est géo-référencée, donc les coordonnées que vous allez voir sont assez bizarres ^^ C'est une contrainte obligatoire, mais à part une petite prise de tête au départ ca ne pose pas de problème par la suite (changement de repère avec l'attribut viewBox et ca rulez )
Les fonds de carte sont généralement assez grand (plus qu'un A4), donc l'image svg finale est redimensionné par XSL-FO grâce aux attributs content-width(height)="scale-to-fit".
But:
Le but est simple: faire rentrer la carto sur la même page que la fiche s'il y a la place, sinon l'afficher sur la page suivante
Contraintes:
- Pas de redimensionnement en "dur" de l'image pour la faire tenir sur la page (on veut garder la taille orginale quitte à faire un saut de page)
- Si possible pas de calcul de taille restante/prise dans XSL (je pense même pas que ca soit possible et de toute manière c'est dégueu )
- Pas d'extension XSL-FO qui ne soit pas supportée par FOP
Le problème:
Ca marche pas
Comme on peut le voir sur l'image, il n'y a aucun calcul de place occupée par l'element svg ou instream-foreign-object ou block (cités dans l'ordre de la hierarchie ascendante) et le contenu overflow joyeusement au delà du flow 'body' et même de la page...
Ce con de FOP arrive à me scaler l'image en largeur pour la faire tenir comme il faut sur la page, mais pas sur la hauteur !
Les solutions testées:
- Une combinaison de keep-with-next(previous).within-page="always" sur un peu tout les éléments impliqués sauf svg (je veux garder la taille originale de l'image, j'aimerai que le redimensionnement se fasse par le conteneur, pas le contenu). Résultat: sans effet
- Une taille (height) spécifiée en dur très supérieur à l'espace disponible pour forcer le saut de page (taille spécifiée sur tout les éléments encore une fois sauf svg). Résultat: nada, toujours overflow comme si FOP s'en tapait d'afficher un truc d'une taille trop grande et qu'il avait la flemme de sauter une page (il le fait très bien pour du texte )
- La crise de nerf à coup de break-before="page". Résultat: bah oui ca marche mais c'est pas ce qu'on veut (je veux que la carte s'affiche sur la même page s'il y a la place)
- Le jetage de pc par la fenêtre
Le code:
Je vous met le XSL-FO généré plutot que le XSLT. Le code qui suit correspond exactement à l'image qui est sur la capture et uniquement l'image (c'est à dire juste après le titre "Carte":
Code :
- <fo:block height="200mm">
- <fo:instream-foreign-object width="100%"
- height="100%" content-width="scale-to-fit"
- content-height="scale-to-fit">
- <svg:svg viewBox="519025 -6702573 5363 4051"
- height="2430px" width="3219px">
- <svg:image height="4051" width="5363"
- y="-6702573" x="519025"
- xlink:href="file:///C:\bdd\docs\cartes\Scan25_Georef.jpg" />
- <svg:path opacity="0.5" stroke="#000000"
- fill="#00FF00"
- d="M 523783.8938573946 -6700316.936139343 L 523783.8938573946 -6700316.936139343 L 523783.8938573946 -6700316.936139343 L 523631.0194352066 -6700383.074914854 L 523440.95934275665 -6700461.614710772 L 523267.4262148676 -6700544.288180159 L 523172.3961686426 -6700602.159608731 L 523114.55179267964 -6700643.4963434255 L 523060.8391578568 -6700688.9667515885 L 522974.0725939123 -6700775.773894445 L 522916.2282179493 -6700854.313690363 L 522850.1203597058 -6700953.5218536295 L 522779.88076032215 -6701102.334098527 L 522746.82683120045 -6701226.344302609 L 522687.38427825283 -6701480.971448455 L 522683.3535104268 -6701480.971448455 L 522804.2765452084 -6701521.297977776 L 522921.168812164 -6701569.689812961 L 522982.33607619273 -6701627.31062914 L 523085.6296046981 -6701652.112669956 L 523201.31835662416 -6701672.781037303 L 523304.61188512953 -6701705.850425058 L 523366.5880022328 -6701738.9198128125 L 523465.74978959793 -6701784.390220976 L 523535.9893889816 -6701821.5932822 L 523639.282917487 -6701854.662669956 L 523721.91774029133 -6701875.3310373025 L 523775.63037511415 -6701883.598384242 L 523821.0795276565 -6701891.865731181 L 523848.290760736 -6701758.684550871 L 523870.32671348383 -6701684.278428421 L 523928.17108944687 -6701552.000877401 L 523947.4525481012 -6701518.931489646 L 523986.01546540984 -6701483.106319578 L 523994.6126555456 -6701474.364710772 L 523965.69046756404 -6701408.225935262 L 523961.5587264238 -6701371.022874038 L 523957.4269852836 -6701317.285118936 L 523940.90002072276 -6701164.339200568 L 523940.90002072276 -6700941.120833221 L 523949.1635030032 -6700709.635118935 L 523949.1635030032 -6700523.619812813 L 523936.76827958255 -6700515.3524658745 L 523887.18738589994 -6700271.46573118 L 523783.8938573946 -6700316.936139343" />
- <svg:rect opacity="0.7" fill="#FFFF00"
- height="100" width="1200" y="-6701259"
- x="522914" />
- <svg:text style="text-anchor: middle; letter-spacing:-10pt; font-family: monospace; font-weight: bold"
- font-size="95" y="-6701169" x="523514">Secteur 4
- : zone urbaine</svg:text>
- </svg:svg>
- </fo:instream-foreign-object>
- </fo:block>
|
Voilà, j'espère vraiment que vous allez pouvoir m'aider avec ca parce que je galère un peu là ^^
Merci d'avance pour votre aide
Message édité par sebchap le 07-11-2008 à 10:41:32