【发布时间】:2012-09-28 08:31:49
【问题描述】:
在将文档另存为 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。
【问题讨论】:
-
水印文件格式是什么?
-
您尝试过ScaleHeight/Width 方法吗?还是取货方式?见msdn.microsoft.com/en-us/library/…
-
@Brannon 该文件是 JPG。我不能使用 ScaleHeight/Width 因为原始图像可能是任何大小,我需要它来完全填满整个页面。 PickUp 方法在这种情况下有何帮助?
标签: c# .net ms-word office-interop