我使用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 使用原始图像大小)?
如果有人可以帮助解决这个问题,我保证会写一篇深入的博文,以确保我将成为最后的人。
答案 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类来获取图像大小。