2009-02-12 5 views
2

Je crée dynamiquement des documents Word à l'aide du moteur de modèle Velocity. Les documents sont créés en XML (en utilisant le standard XML Microsoft Office 2003 WordprocessML).Obtenir les dimensions de l'image originale lors de l'intégration de l'image dans WordprocessingML

J'Embedding une image (codé en base64) à l'intérieur du WordML de manière traditionnelle:

<w:pict> 
    <v:shapeType> ... </v:shapeType>  
    <w:binData w:name="wordml://02000002.jpg"> [ encoded data] </w:binData> 

    <v:shape id="_x0000_s1026" 
      type="#_x0000_t75" 
      style="width:100%;height:100%" 
      o:allowoverlap="f" 
      > 
     <v:imagedata src="wordml://02000002.jpg" o:title="testimage2"> 
     </v:imagedata> 
    </v:shape> 

</w:pict> 

La question est à l'image de la taille/mise à l'échelle. Notez l'attribut style sur la balise <v:shape>. Réglage de la hauteur et la largeur à 100% ne pas taille de l'image à sa taille réelle. Il définit la hauteur et la largeur à environ 1,04 pouces qui fausse l'image. Laissant la hauteur et la largeur a le même effet. Régler la hauteur et la largeur sur auto a le même effet. Plus agaçant, si j'ouvre le document généré dans Word 2003, faites un clic droit sur l'image, ouvrez la boîte de dialogue Format Image, et allez dans l'onglet Taille, il affiche la hauteur et la largeur sous "Taille d'origine". Il fournit même un bouton «Réinitialiser» qui redimensionne l'image à sa taille d'origine (en supposant que la case «Relative to original size size» est cochée).

Ma question est:

Y at-il de toute façon dans le contexte de WordML pour obtenir les valeurs de taille d'origine pour l'image (ou demander à Word utiliser la taille de l'image d'origine)?

Si quelqu'un peut aider sera cette question, je promets que je vais écrire un blog en poste de profondeur pour assurer que je serai la dernière personne qui doit faire face à cela.

+0

peut-être que le cadre que vous utilisez pour générer le document XML fournit une méthode pour récupérer la taille de l'image? Ou peut-il être prolongé pour que cela le fasse? –

+0

Je pourrais faire le traitement d'image dans mon code Java et passer la hauteur/largeur au contexte de vitesse. C'est possible mais pas idéal dans ma situation. (J'ai actuellement un prototype qui fait cela, mais en raison des différences de résolution d'image (75 dpi contre 96) cela ne fonctionne pas toujours bien.) –

+0

Je suis en train de faire face à ce que nous parlons. Avez-vous trouvé une solution par hasard? – bernhof

Répondre

0

Vous devez définir la largeur et la hauteur dans l'attribut "style" de l'élément "v: shape" sur 0px. Par exemple:

<v:shape style="width:0px;height:0px" > 

L'image aura la taille d'origine.

0

Je ne comprends pas pourquoi vous comptez sur WordML pour obtenir la taille de l'image? Vous alimentez une image en document Word, vous pouvez obtenir la taille de l'image en utilisant la classe Bitmap.

1

Si vous utilisez des modèles xslt vous pouvez écrire un script C# dans votre modèle comme ça (il est pour métafichiers (.wmf) mais vous pouvez réécrire pour Bitmap classe à utiliser au format .jpg):

<msxsl:script language="C#" implements-prefix="user"> 
    <msxsl:assembly name="System.Drawing" /> 
    <msxsl:using namespace="System.Drawing.Imaging" /> 


    <![CDATA[ 

      public static double getImageWidthFrom64String(string base64) 
      { 
      byte[] bytes = Convert.FromBase64String(file); 
      System.Drawing.Imaging.Metafile image; 
      using (System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes)) 
      { 
       image = 
(System.Drawing.Imaging.Metafile)System.Drawing.Imaging.Metafile.FromStream(ms); 
      } 
     return image.Width; 
      } 

      public static double getImageHeightFrom64String(string base64) 
      { 
      byte[] bytes = Convert.FromBase64String(file); 
      System.Drawing.Imaging.Metafile image; 
      using (System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes)) 
      { 
       image = 
(System.Drawing.Imaging.Metafile)System.Drawing.Imaging.Metafile.FromStream(ms); 
      }  
      return image.Height; 
      } 
    ]]> 
     </msxsl:script> 

Ensuite, vous pouvez utiliser ces fonctions pour obtenir réelle taille de l'image dans votre modèle:

<xsl:template match="/ns1:Work/ns1:leaderSignature"> 
    <ns1:picture> 
     <xsl:for-each select="@ns1:*|@*[namespace-uri()='']"> 
     <xsl:attribute name="{name()}" namespace="{namespace-uri()}"> 
      <xsl:value-of select="." /> 
     </xsl:attribute> 
     </xsl:for-each> 
     <xsl:variable name="filename" select="concat(concat('leadsig',ancestor::ns1:Work/ns1:id),'.wmz')"/> 
     <xsl:variable name="file64String" select="."></xsl:variable> 
     <w:r> 
     <w:rPr> 
      <w:noProof /> 
     </w:rPr> 
     <w:pict>  
      <w:binData w:name="{concat('wordml:\\',$filename)}"> 
      <xsl:value-of select="." /> 
      </w:binData> 
      <v:shape id="pic3" o:spid="_x0000_s1028" style=" 
      width:{user:getImageWidthFrom64String($file64String)}; 
      height:{user:getImageHeightFrom64String($file64String)}; 
      position:absolute;   
      text-align:left; 
      left:0; 
      margin-left:430pt; 
      margin-top:192pt;  
      z-index:2; 
      visibility:visible; 
      mso-position-horizontal-relative:page; 
      mso-position-horizontal:absolute; 
      mso-position-vertical-relative:page; 
      mso-position-vertical:absolute; 
      mso-wrap-style:square; 
      mso-wrap-distance-left:9pt; 
      mso-wrap-distance-top:0; 
      mso-wrap-distance-right:9pt; 
      mso-wrap-distance-bottom:0">   
      <v:imagedata src="{concat('wordml:\\',$filename)}" o:title="" /> 
      <w10:wrap anchorx="page" anchory="page" /> 
      </v:shape> 
     </w:pict> 
     </w:r> 
    </ns1:picture> 
    </xsl:template><!--Leader Signature--> 
Questions connexes