我遇到一个问题,需要在将文档另存为PDF之前,在文档中添加水印图片(用作信纸)。将图片插入所有相关的页眉没有问题。但是,一旦我尝试将图片(形状)拉伸到整个页面的宽度和高度,Word 2007(SP3)就会抛出异常。相同的代码在Word 2010(SP1)中可以正常使用。无论我使用Office 12还是Office 14互操作程序集(始终与“嵌入互操作类型”为true一起使用),都没有关系。
抛出的异常如下:
我不确定英文错误信息的具体内容,但翻译大致为“此命令的绘画类型(或形状类型)无效”。
奇怪的是,并不总是发生相同的Interop调用错误。如果我删除设置
我正在使用失败的Word 2007中记录的宏代码。我也正确切换到头部SeekView,然后执行任何与头部相关的代码,因为我已经需要这些代码来处理其他页眉/页脚。
以下是完整代码,用于添加形状。它应该只是插入图片并将其拉伸到整个页面大小。注意:此方法仅适用于实际存在的标题(
请给出任何建议,如何调整代码,使其能够与Word 2007和Word 2010兼容。
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兼容。