在WordprocessingML中嵌入图像时获取原始图像尺寸

时间:2009-02-12 15:19:51

标签: xml ms-word wordml

我使用Velocity模板引擎动态创建Word文档。文档以XML格式创建(使用Microsoft Office 2003 WordprocessML XML标准)。

我正在以传统方式在WordML中嵌入一个图像(以Base64格式编码):

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

问题在于图像大小调整/缩放。请注意style标记上的<v:shape>属性。将高度和宽度设置为100%不会将图像调整为实际大小。它将高度和宽度设置为大约1.04英寸,这会使图像歪斜。离开高度和宽度具有相同的效果。将高度和宽度设置为auto具有相同的效果。

最令人讨厌的是,如果我在Word 2003中打开生成的文档,右键单击图像,打开“格式图片”对话框,然后转到“大小”选项卡,它会在“原始大小”下显示正确的高度和宽度。它甚至提供了一个“重置”按钮,可以将图像大小调整为原始大小(假设选中“相对于原始图片大小”复选框。)

我想:!* @&amp;#^#%???

所以我的问题是:

无论如何在WordML的上下文中获取图像的原始大小值(或指示Word 使用原始图像大小)?

如果有人可以帮助解决这个问题,我保证会写一篇深入的博文,以确保我将成为最后的人。

3 个答案:

答案 0 :(得分:1)

如果您正在使用xslt模板,您可以在模板中编写一些C#脚本(它适用于元文件(.wmf),但您可以将其重写为Bitmap类以与.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>

然后,您可以使用这些功能在模板中获得真实的图像尺寸:

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

答案 1 :(得分:0)

您需要将“v:shape”元素的“style”属性中的width和height设置为0px。例如:

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

图像将具有原始尺寸。

答案 2 :(得分:0)

我不明白为什么你依靠WordML来获取图像大小?您正在将图像输入到Word文档中,您可以使用Bitmap类来获取图像大小。