Word 2007在处理操作形状的Interop代码时会抛出异常,但在Word 2010中可以正常工作。

5
我遇到一个问题,需要在将文档另存为PDF之前,在文档中添加水印图片(用作信纸)。将图片插入所有相关的页眉没有问题。但是,一旦我尝试将图片(形状)拉伸到整个页面的宽度和高度,Word 2007(SP3)就会抛出异常。相同的代码在Word 2010(SP1)中可以正常使用。无论我使用Office 12还是Office 14互操作程序集(始终与“嵌入互操作类型”为true一起使用),都没有关系。 抛出的异常如下:
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)

我不确定英文错误信息的具体内容,但翻译大致为“此命令的绘画类型(或形状类型)无效”。
奇怪的是,并不总是发生相同的Interop调用错误。如果我删除设置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兼容。

1
什么是水印文件格式? - Brannon
你尝试过ScaleHeight/Width方法吗?或者PickUp方法?参见http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.shape_methods.aspx。 - Brannon
@Brannon 该文件是JPG格式。由于原始图像可能是任何尺寸,我无法使用ScaleHeight/Width方法来确保图片填满整个页面。在这种情况下,PickUp方法如何帮助解决问题? - cremor
2个回答

1

我知道这并没有像您要求的那样修复代码以在两个版本的Word上运行,但是您尝试过使用图像的绝对大小吗?保持相对定位,但使用绝对大小。您是否真的需要相对大小(即您的文档包含多个页面大小)。

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

太棒了!我现在正在使用这个解决方法,它确实可以防止异常情况的发生。通过使用 section.PageSetup.PageWidth/PageHeight 中的值,甚至可以在一个文档中适用于不同的页面大小。非常感谢你! - cremor
有时候,解决问题只需要完全新的视角......而不是狭隘地专注于一个看似正确的解决方案。很高兴这个简单的解决方法能够帮到您,并感谢您的慷慨奖赏 :) - zeFrenchy

0

从Word 97到Word 2003,Word对象模型中存在一个鲜为人知的bug,如果活动Word文档的放大倍数不是100%,则会导致WdRelativeHorizontalPosition.wdRelativeHorizontalPositionPageWdRelativeVerticalPosition.wdRelativeVerticalPositionPage检索到不正确的信息。我怀疑这个问题在Word 2007中仍然存在,并可能导致您的异常。以下是两个线程(都涉及VBA中的相同问题),它们提到了这个问题:

Information-wdHorizontalPositionSubroutines返回的点

Word 97 wdHorizontalPositionRelativeToPage

我建议在页眉添加形状后(并在检索相对水平和垂直位置到页面之前)添加代码,将活动文档的缩放比例更改为100%,并将视图类型更改为印刷布局视图。(当执行更改形状定位和大小的代码时,您可能需要尝试显示 Word 文档的哪个部分。有时,活动文档必须显示/能够编辑主文档而不是页眉。)


谢谢您提供的信息,但看起来这不是问题所在。即使我确保文档以100%的缩放打开,仍然会出现相同的异常情况;如果我将以下代码添加到我的应用程序中,仍然会出现异常:_application.ActiveWindow.ActivePane.View.Zoom.Percentage = 100; 我已经有一些切换到“页面视图”的代码,因为这对于某些其他操作是必要的。 - cremor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接