Word 2007抛出异常代码来操作形状但在Word 2010中正常工作

时间:2012-09-28 08:31:50

标签: c# .net ms-word office-interop

我遇到的问题是在将文档保存为PDF之前将水印图片(用作文具)添加到文档中时遇到大问题。将图片插入所有相关标头是没有问题的。但是一旦我尝试将图片(形状)拉伸到整个页面宽度和高度,Word 2007(SP3)就会抛出异常。相同的代码在Word 2010(SP1)中正常工作。如果我使用Office 12或Office 14互操作程序集(始终与“嵌入互操作类型”一起使用),则无关紧要。

抛出的异常如下:

System.Runtime.InteropServices.COMException (0x800A122C): Falscher Zeichnungselement-Typ für diesen Befehl.
   at Microsoft.Office.Interop.Word.Shape.set_RelativeHorizontalSize(WdRelativeHorizontalSize prop)
   at BEKO.PDB.AuxiliaryServices.Documents.WordCreationService.AddWatermarkToHeader(HeaderFooter header, String watermarkFilePath)

我不确切地知道英文错误信息是什么,但翻译类似于“此命令的无效绘画类型(或可能是形状类型)”。

奇怪的是,它在同一个互操作调用中并不总是出错。如果我删除设置RelativeHorizontalSize属性的行,则在设置其他属性时失败,例如WidthRelative(具有相同的例外)。如果我添加一行设置shape.LeftRelative(到“不使用”常量),它甚至会失败,否则就像shape.Top一样工作(同样的例外)。

我正在使用的代码来自在失败的Word 2007中记录的宏。我还正确地在执行任何与头相关的代码之前切换到头SeekView,因为我已经需要其他一些页眉/页脚代码

以下是添加形状的完整代码。它应该只是插入图片并将其拉伸到整页大小。注意:此方法仅针对实际存在(headerFooter.Exists)且未链接到上一个(!headerFooter.LinkToPrevious)的标头调用。

private static void AddWatermarkToHeader(HeaderFooter header, string watermarkFilePath) {
   header.Range.Editors.Add(WdEditorType.wdEditorEveryone);

   Shape shape = header.Shapes.AddPicture(
      FileName: watermarkFilePath,
      LinkToFile: false,
      SaveWithDocument: true
   );

   shape.WrapFormat.AllowOverlap = (int)MsoTriState.msoTrue;
   shape.WrapFormat.Type = WdWrapType.wdWrapNone;

   shape.RelativeHorizontalPosition = WdRelativeHorizontalPosition.wdRelativeHorizontalPositionPage;
   shape.RelativeVerticalPosition = WdRelativeVerticalPosition.wdRelativeVerticalPositionPage;
   shape.Left = 0;
   shape.Top = 0;

   shape.RelativeHorizontalSize = WdRelativeHorizontalSize.wdRelativeHorizontalSizePage;
   shape.RelativeVerticalSize = WdRelativeVerticalSize.wdRelativeVerticalSizePage;
   shape.WidthRelative = 100;
   shape.HeightRelative = 100;

   shape.ZOrder(MsoZOrderCmd.msoSendBehindText);
}

请提供任何建议如何解决此问题,以便代码适用于Word 2007和Word 2010。

2 个答案:

答案 0 :(得分:1)

我意识到这并不是修复在所请求的两个版本的Word上运行的代码,但您是否尝试过对图像使用绝对大小调整?保持相对位置,但使用绝对大小。您是否真的需要相对大小调整(即您的文档是否包含多个页面大小?)。

shape.Width = page.Width;
shape.Height = page.Height;

答案 1 :(得分:0)

从Word 97到Word 2003,Word对象模型中存在一个鲜为人知的错误,导致WdRelativeHorizontalPosition.wdRelativeHorizontalPositionPageWdRelativeVerticalPosition.wdRelativeVerticalPositionPage检索到错误信息,如果活动Word文档的放大率不是100%。我怀疑这个问题在Word 2007中仍然存在,可能会导致您的异常。以下是引用此问题的两个线程(都处理VBA中的相同问题):

Points-returned-by-Information-wdHorizontalPositionSubroutines

Word 97 wdHorizontalPositionRelativeToPage

我建议在标题中添加形状后(在检索页面的相对水平和垂直位置之前)添加代码,将Active Document的缩放更改为100%,将View Type更改为Print Layout视图。 (当执行更改形状的定位和大小调整的代码时,您可能必须尝试显示Word文档的哪个部分。有时,Active Document需要显示/能够编辑主文档而不是标题。)