[Résolu]Débordement d'image dans pdf générer par FOP

Débordement d'image dans pdf générer par FOP [Résolu] - XML/XSL - Programmation

Marsh Posté le 29-10-2008 à 17:58:48    

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 :D
 
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 :o)
 
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 :o)
  • Pas d'extension XSL-FO qui ne soit pas supportée par FOP


Le problème:
Ca marche pas :o
http://img444.imageshack.us/img444/6312/imageoverflowbj6.th.pnghttp://img444.imageshack.us/images/thpix.gif
 
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  :fou: !
 
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 [:petrus75] (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 :
  1. <fo:block height="200mm">
  2.               <fo:instream-foreign-object width="100%"
  3.               height="100%" content-width="scale-to-fit"
  4.               content-height="scale-to-fit">
  5.                 <svg:svg viewBox="519025 -6702573 5363 4051"
  6.                 height="2430px" width="3219px">
  7.                   <svg:image height="4051" width="5363"
  8.                   y="-6702573" x="519025"
  9.                   xlink:href="file:///C:\bdd\docs\cartes\Scan25_Georef.jpg" />
  10.                   <svg:path opacity="0.5" stroke="#000000"
  11.                   fill="#00FF00"
  12.                   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" />
  13.                   <svg:rect opacity="0.7" fill="#FFFF00"
  14.                   height="100" width="1200" y="-6701259"
  15.                   x="522914" />
  16.                   <svg:text style="text-anchor: middle; letter-spacing:-10pt; font-family: monospace; font-weight: bold"
  17.                   font-size="95" y="-6701169" x="523514">Secteur 4
  18.                   : zone urbaine</svg:text>
  19.                 </svg:svg>
  20.               </fo:instream-foreign-object>
  21.             </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
Reply

Marsh Posté le 29-10-2008 à 17:58:48   

Reply

Marsh Posté le 29-10-2008 à 18:03:48    

petite idée (à la con) : tu as essayé en virant le height="100%"en espérant qu'il sera de lui même redimensionné la hauteur ?

Reply

Marsh Posté le 30-10-2008 à 12:36:16    

lordankou a écrit :

petite idée (à la con) : tu as essayé en virant le height="100%"en espérant qu'il sera de lui même redimensionné la hauteur ?


Salut !
Oui j'avais essayé, mais j'ai oublié de le préciser ;)
En fait, lorsque je change les attributs width et height sur l'élément instream-foreign-object l'image est bel et bien redimensionnée, mais il y a toujours overflow.
 
Si j'augmente width (ou si je l'enlève, ce qui reviens au même étant donné que la source est très grande), le scale-to-fit scale (en réduction) d'autant moins ou pas du tout l'image (normal), mais l'image overflow également en largeur comme sur cette image (ici width absent, height=100%):
http://img241.imageshack.us/img241/3476/imageoverflowwidthaz5.th.pnghttp://img241.imageshack.us/images/thpix.gif
 
Si je réduis width ou height, l'image est bien redimensionnée, mais overflow toujours si elle dépasse la page (ici j'ai réduis height, fixé à 150mm, width=100%):
http://img504.imageshack.us/img504/6174/imageoverflowheightjs7.th.pnghttp://img504.imageshack.us/images/thpix.gif
 
Ca met en évidence une chose pour moi: les attributs width et height sont bien relatifs à la taille de la page (quand utilisés avec des %) ce qui est normal, mais le calcul de la reservation d'espace est incapable de determiner si le saut de page est nécessaire ou pas, peu importe que les attributs aient des valeurs relatives (%) ou absolues (mm). Et ca pour moi c'est une feature non documentée :o
 
Voilà voilà ^^ Merci de ton aide quand même ;)

Reply

Marsh Posté le 03-11-2008 à 10:33:39    

Remonte petit topic ^^
Personne n'a jamais essayer de faire tenir une grosse image ? :(

Reply

Marsh Posté le 06-11-2008 à 19:21:55    

Problème réglé, voir la discussion ici:
http://www.nabble.com/Image-overfl [...] #a20344433
Problème de block-container empechant le page-break...

Reply

Sujets relatifs:

Leave a Replay

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