IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

[XSL~FO] Débordement d'image dans pdf généré par FOP


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 2
    Par défaut [XSL~FO] Débordement d'image dans pdf généré par FOP
    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 :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


    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 !

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
                <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>
    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 :'()
      Sur l'élément instream-foreign-object, 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%):


      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%):


      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
    • 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


    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

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 2
    Par défaut Résolu
    Problème réglé, cf. discussion ici : http://www.nabble.com/Image-overflow...html#a20344433
    Le block-container empêchait le page-break

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/08/2013, 13h47
  2. [XL-2007] Images dans mail généré par Xl envoye via Outlook
    Par stefprotois dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 29/06/2012, 10h07
  3. les fichiers pdf générés par le client se plaçe dans le serveur
    Par john_wili dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 10/03/2009, 17h49
  4. Réponses: 1
    Dernier message: 26/03/2008, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo