所以。这是一个很难回答的问题:
我为 Word 2007 开发了一个 Word 插件,然后升级到 Word 2010。它在 2007 年很稳定,但是升级后一个重要功能停止工作,所以我不得不恢复我的更改。
停止的特定功能在文档中获取选定的图片,并在其旁边添加一个文本框,具有特定的格式。(我将在问题末尾提供代码)
最终版本可以安装在 2007 和 2010 版本中,但只能在 2007 年使用。直到今天!... [悬念]
偶然地,一位客户使用该插件在 Word 2010 上处理文档,令人惊讶的是,它成功了!
所以我去调查这个问题。我复制了一份工作文档和一份非工作版本的同一文档,并比较了两者的 OpenXML。
这是我发现的:
工作文件
这是工作文档上的图片标记:
<w:drawing>
<wp:inline distT="0" distB="0" distL="0" distR="0">
<wp:extent cx="3251200" cy="2285390"/>
<wp:effectExtent l="19050" t="19050" r="25400" b="19685"/>
<wp:docPr id="193" name="Imagem 48" descr="Elev. 4"/>
<wp:cNvGraphicFramePr>
<a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"/>
</wp:cNvGraphicFramePr>
<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:nvPicPr>
<pic:cNvPr id="0" name=""/>
<pic:cNvPicPr/>
</pic:nvPicPr>
<pic:blipFill>
<a:blip r:embed="rId33">
<a:lum/>
</a:blip>
<a:stretch>
<a:fillRect/>
</a:stretch>
</pic:blipFill>
<pic:spPr>
<a:xfrm>
<a:off x="0" y="0"/>
<a:ext cx="3251200" cy="2285390"/>
</a:xfrm>
<a:prstGeom prst="rect">
<a:avLst/>
</a:prstGeom>
<a:noFill/>
<a:ln w="19044" cmpd="sng">
<a:solidFill>
<a:srgbClr val="333333"/>
</a:solidFill>
<a:prstDash val="solid"/>
</a:ln>
</pic:spPr>
</pic:pic>
</a:graphicData>
</a:graphic>
</wp:inline>
</w:drawing>
不是工作文件
这是非工作文档上的相同图片标记:
<w:drawing>
<wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="0FC2E46A" wp14:editId="42C17A65">
<wp:extent cx="3251200" cy="2285390"/>
<wp:effectExtent l="19050" t="19050" r="25400" b="19685"/>
<wp:docPr id="50" name="Imagem 50" descr="Elev. 1"/>
<wp:cNvGraphicFramePr>
<a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"/>
</wp:cNvGraphicFramePr>
<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:nvPicPr>
<pic:cNvPr id="0" name=""/>
<pic:cNvPicPr/>
</pic:nvPicPr>
<pic:blipFill>
<a:blip r:embed="rId24">
<a:lum/>
</a:blip>
<a:stretch>
<a:fillRect/>
</a:stretch>
</pic:blipFill>
<pic:spPr>
<a:xfrm>
<a:off x="0" y="0"/>
<a:ext cx="3251200" cy="2285390"/>
</a:xfrm>
<a:prstGeom prst="rect">
<a:avLst/>
</a:prstGeom>
<a:noFill/>
<a:ln w="19044" cmpd="sng">
<a:solidFill>
<a:srgbClr val="333333"/>
</a:solidFill>
<a:prstDash val="solid"/>
</a:ln>
</pic:spPr>
</pic:pic>
</a:graphicData>
</a:graphic>
</wp:inline>
</w:drawing>
唯一的区别在于第二行,工作文档的内容如下:
<wp:inline distT="0" distB="0" distL="0" distR="0">
另一个是:
<wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="0FC2E46A" wp14:editId="42C17A65">
所以!不工作的文档图片有两个额外的属性wp14:anchorId
和wp14:editId
.
功能:
这是将文本框添加到图片并设置其格式的方法。
Sub AddTextBox(ByVal picture As Word.InlineShape)
Dim textBox As Word.Shape =
ActiveDocument.Shapes.AddTextbox(
Orientation:=Microsoft.Office.Core.MsoTextOrientation.msoTextOrientationHorizontal,
Left:=picture.Width + 10,
Top:=0,
Width:=MarginWidth - picture.Width - 10,
Height:=picture.Height,
Anchor:=picture.Range.Paragraphs(1).Range)
With textBox
.RelativeHorizontalPosition = Word.WdRelativeHorizontalPosition.wdRelativeHorizontalPositionMargin
.RelativeVerticalPosition = Word.WdRelativeVerticalPosition.wdRelativeVerticalPositionParagraph
.Line.DashStyle = Microsoft.Office.Core.MsoLineDashStyle.msoLineSolid
.Line.BackColor.RGB = RGB(255, 255, 255)
.Line.Style = Microsoft.Office.Core.MsoLineStyle.msoLineSingle
.Line.Weight = 0.25
.LockAnchor = True
End With
EndSub
问题:
如您所见,上面的方法将文本框与图像所在的段落顶部对齐。图像是内联的,因此,文本框顶部与图像顶部对齐。这就是 word 2007 和所提及的工作文件中发生的情况。
问题是:当我在不工作的文档上运行此方法时,文本框最终与 PAGE 的顶部对齐。无边际。
这份工作文件很特别。所有其他的行为都与 Word 2010 中的不工作一样。
我研究了 MSDN 文档,没有关于这些属性的信息。
所以,请:
- 什么是属性
wp14:anchorId
和wp14:editId
? - 以及如何让 Word 停止生成它们?
- 或者当这些属性存在时如何阻止文本框进入页面顶部。
首先十分感谢。