c# - Word 2007 为操作形状但在 Word 2010 中正常工作的互操作代码引发异常

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

我在将文档保存为 PDF 之前应将水印图片(用作文具)添加到文档中时遇到了很大的问题。将图片插入所有相关的标题是没有问题的。但是,一旦我尝试将图片(形状)拉伸(stretch)到整个页面的宽度和高度,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)

我不知 Prop 体的英文错误信息是什么,但翻译是“Invalid painting type (or maybe shape type) for this command”。

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

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

这是添加形状的完整代码。它应该只插入图片并将其拉伸(stretch)到整个页面大小。注意:此方法仅针对实际存在的 header (headerFooter.Exists) 以及未链接到之前的 header (!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。

最佳答案

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

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

关于c# - Word 2007 为操作形状但在 Word 2010 中正常工作的互操作代码引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12636399/

相关文章:

c# - 有没有办法从 .NET 应用程序中的 WebBrowser 控件内部启用 IE8 开发人员工具

C#。适用于大数据的可扩展高负载架构

c# - LINQ 到存储过程。我可以使用动态参数列表来调用 SP,而不是强类型化它们吗?

c# - 无法使用 Visual Studio 2010 调试 XBAP

VB.Net:按行搜索Word文档

c# - 运行组合框中显示的 .pdf 最简单的方法是什么?

c# - 位图锁定位和克隆

.net - 是否可以通过编程方式调试自己的 .NET 进程

java - Apache poi word文档空指针异常

c# - 来自 Amazon S3 的 Word 文件的内容类型