5

我在将水印图片(用作文具)保存为 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。

4

2 回答 2

1

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

shape.Width = page.Width;
shape.Height = page.Height;
于 2012-10-08T14:56:49.007 回答
0

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

Points-returned-by-Information-wdHorizo​​ntalPositionSubroutines

Word 97 wdHorizo​​ntalPositionRelativeToPage

I suggest adding code after the addition of the shape in the header (and prior to retrieving the relative horizontal and vertical positions to the page) that changes the Active Document's zoom to 100% and the View Type to the Print Layout view. (You may have to experiment with which part of the Word document is displayed when the code for changing the positioning and sizing of the shape is executed. Sometimes it will be necessary for the Active Document to display/be able to edit the main document instead of the header.)

于 2012-10-08T17:37:22.480 回答