Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1179 connectés 

  FORUM HardWare.fr
  Programmation
  XML/XSL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1806061
sebchap
Share the knowledge
Posté le 29-10-2008 à 17:58:48  profilanswer
 

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
mood
Publicité
Posté le 29-10-2008 à 17:58:48  profilanswer
 

n°1806064
lordankou
Posté le 29-10-2008 à 18:03:48  profilanswer
 

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 ?

n°1806308
sebchap
Share the knowledge
Posté le 30-10-2008 à 12:36:16  profilanswer
 

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 ;)

n°1807603
sebchap
Share the knowledge
Posté le 03-11-2008 à 10:33:39  profilanswer
 

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

n°1809151
sebchap
Share the knowledge
Posté le 06-11-2008 à 19:21:55  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  XML/XSL

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

 

Sujets relatifs
[résolu] Problème d'accent avec FOPInsérer une image dans un tableau
[Resolu] Pbm de "récupération de paramètres" avec Ajax.Request[résolu] petit script en python
[Résolu] - [Batch Dos] Probleme carateres dans resultat txtAfficher le résultat d'un formulaire dans une iframe [résolu 2FOIS]
[C#] simuler un click souris [résolu][Résolu]Faire évoluer une requête SQL
Plus de sujets relatifs à : [Résolu]Débordement d'image dans pdf générer par FOP


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR