Получите исходные размеры изображения при встраивании изображения в WordprocessingML - PullRequest
2 голосов
/ 12 февраля 2009

Я динамически создаю документы Word, используя шаблонизатор Velocity. Документы создаются в формате XML (с использованием стандарта Microsoft Office 2003 WordprocessML XML).

Я встраиваю изображение (закодированное в формате Base64) в WordML традиционным способом:

<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, щелкните правой кнопкой мыши на изображении, откройте диалоговое окно «Формат изображения» и перейдите на вкладку «Размер», где в «Исходном размере» отображаются правильные высота и ширина. Он даже предоставляет кнопку «Сброс», которая изменяет размер изображения до его исходного размера (при условии, что установлен флажок «Относительно исходного размера изображения».)

Я как:! * @ & # ^ #% ???

Итак, мой вопрос:

В любом случае в контексте WordML можно получить исходные значения размера для изображения (или указать Word использовать исходный размер изображения)?

Если кто-то может помочь с ответом на этот вопрос, я обещаю, что напишу подробное сообщение в блоге, чтобы убедиться, что я буду последним человеком, который имеет дело с этим.

Ответы [ 3 ]

1 голос
/ 14 ноября 2013

Если вы используете шаблоны 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-->
0 голосов
/ 14 марта 2012

Я не понимаю, почему вы используете WordML для получения размера изображения? Вы вводите изображение в документ Word, вы можете получить размер изображения с помощью класса Bitmap.

0 голосов
/ 03 августа 2010

Вам необходимо установить ширину и высоту в атрибуте "style" элемента "v: shape" в 0px. Например:

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

И изображение будет иметь оригинальный размер.

...