处理兼容模式文档时,VSTO 应用程序中的 HeaderFooter 枚举失败

问题描述 投票:0回答:1

我在 Visual Studio 2022 中创建了一个 C# MS Word VSTO 插件,它循环遍历文档中的页脚,并将文本框和字段代码注入到不同部分的页脚中。此代码适用于 .docx 文档。但是,对于处于兼容模式的 .doc 文档,

WdHeaderFooterIndex.wdHeaderFooterFirstPage
会被误认为
Word.WdHeaderFooterIndex.wdHeaderFooterPrimary
。因此,当代码请求首页页脚时,程序会将文本框和字段代码插入到主页脚中。这会导致没有内容插入到首页页脚中,并且不会将重复内容插入到主页脚中。

这是代码:

  foreach (Word.Section section in activeDoc.Sections)
  {
      foreach (Word.HeaderFooter footer in section.Footers)
      {
          activeDoc.PageSetup.DifferentFirstPageHeaderFooter = -1;

          // Calculate the width of the page
          float pageWidth = activeDoc.PageSetup.PageWidth;

          // Calculate the top position for the text box
          float textBoxHeight = 24;
          float topPosition = activeDoc.PageSetup.PageHeight - textBoxHeight;

          // Insert the shape
          Word.Shape docIdTextBox = footer.Shapes.AddTextbox(
              Office.MsoTextOrientation.msoTextOrientationHorizontal,
              0, topPosition, pageWidth, textBoxHeight);
                    
          //additional code for formatting the text box/inserting the field code
      }
  }

我尝试了以下方法但没有成功:

  • 调试以确定代码是否错误地读取了 HeaderFooter 索引。它不是。读取
    WdHeaderFooterIndex.wdHeaderFooterFirstPage
    时,索引被正确识别,内容被错误插入到
    Word.WdHeaderFooterIndex.wdHeaderFooterPrimary
  • 使用
    if (activeDoc.CompatibilityMode == (int)Word.WdCompatibilityMode.wdWord2003)
    识别兼容模式文档,并使用不同的代码语句插入不同的形状、文本等。
  • 明确引用
    activeDoc.Sections[1].Footers[Word.WdHeaderFooterIndex.wdHeaderFooterFirstPage].Range;
    而不使用循环
  • 将 Visual Studio Tools for Office Runtime 更新到最新版本
  • 引用包含 VSTO Framework 4.6.2 解决方案中的页脚插入代码的 .NET Framework 4.0 类库,然后调用较低的框架代码(其背后的想法是较新的框架引入了一个错误,并且通过在较旧的框架,我也许可以绕过这个问题)

其他注意事项:

  • 如果我通过 Word 另存为或通过 Microsoft 365 Word 的文件|信息|转换兼容模式命令手动将兼容模式 .doc 转换为 .docx,我的代码运行良好(我的公司不允许我以编程方式转换文档)
  • 我使用的测试兼容性文档没有手动添加的部分。它们仅由一页(仅第一页页脚)或多个页面(第一页页脚和第一页之后所有页面的主页脚)组成

非常感谢所有帮助。

c# ms-word vsto office-interop compatibility
1个回答
0
投票

我能够确定是文本框形状(以及一般形状)导致 .doc 兼容模式文档错误识别或跳过

WdHeaderFooterIndex.wdHeaderFooterFirstPage
并将用于该页脚的内容放置在
Word.WdHeaderFooterIndex.wdHeaderFooterPrimary
中。为了解决这个问题,我手动创建了一个包含形状(在我的例子中是文本框)的 MS Word 构建块,并将其放置在自己的模板文件中,该模板文件将在 Word 启动时通过 STARTUP 目录加载。然后,我通过代码将构建块添加到需要内容的页脚(包括第一页页脚)。一旦文本框位于正确页脚的
Range
中,Word 365 就允许我对形状执行所有编程功能,包括循环页脚以查找和操作形状。

这是我的代码:

using Word = Microsoft.Office.Interop.Word;

Word.Document activeDoc = Globals.ThisAddIn.Application.ActiveDocument;
Word.Template bblocksTemplate = Globals.ThisAddIn.Application.Templates[BBlocksTemplatePath];
Word.BuildingBlock textBoxBuildingBlock = bblocksTemplate.BuildingBlockEntries.Item("NameOfBuildingBlock");
textBoxBuildingBlock.Insert(footer.Range, true); //footer was passed into this method

foreach (Word.Shape shape in footer.Range.ShapeRange)
{
    if (shape.Type == Office.MsoShapeType.msoTextBox)
    {
        Word.Range fieldRange = shape.TextFrame.TextRange;
        //Add field code, text, formatting, etc.
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.