如何操作以只读模式打开的 Word 2013 文档

How to manipulate a Word 2013 document opened in read only mode

我必须以只读模式打开 Word 文档以实现自动化。然后我必须从该文档中删除某些页面,关于用户在程序的用户界面中所做的一些配置。

操作确实适用于页脚和页眉,但此特定代码不起作用。它因错误 System.Runtime.InteropServices.COMException (0x800A11FD) 而中断:此方法或 属性 不可用,因为此命令不可用于读取。 执行此代码时:

 int num = objWordDoc.ComputeStatistics(stat, ref missing);
 int[] a = { 1,3,5};
 for (int i = 0; i < a.Length; i++)
 {
    object page_num = a[i];
    objWordDoc.Application.Selection.GoTo(Word.WdGoToItem.wdGoToPage,
        Word.WdGoToDirection.wdGoToAbsolute, num, page_num);
    objWordDoc.Application.Selection.Bookmarks[@"\Page"].Select();
    objWordDoc.Application.Selection.Delete();
 }

在调用 Selection.Goto 的行中。此代码取自 How to delete pages in a word document dynamically.

当用户遵循 http://myitforum.com/myitforumwp/2013/06/10/disable-reading-mode-and-protected-view-in-word-2013/ 中描述的过程时,使用文档确实有效。主要是一个设置必须被禁用: 禁用阅读视图。转到文件 - 选项 - 常规。取消选中“在阅读视图中打开电子邮件附件和其他不可编辑的文件”

这似乎只对 Word 2013 有必要,因为 Word 2010 工作正常。是否可以通过编程方式强制编辑模式而无需让用户定义这些设置?

---更新---

使用这种方法的原因:

为了关闭阅读模式,您需要将其放在代码的开头 Globals.ThisAddIn.Application.Options.AllowReadingMode = false;

您可能会因为循环的方向而出错。删除后,您的第一页是第 1 页,然后第 2 页变为第 1 页等

如果您反转此操作并先删除最后一页,那么它将删除正确的页面。

    public void TestCallBack1(Office.IRibbonControl control)
    {
        Globals.ThisAddIn.Application.Options.AllowReadingMode = false;
        //"S:\Test doc.docx"
        Word.Document doc = Globals.ThisAddIn.Application.Documents.Open("S:\Test doc.docx",Type.Missing,true);
        int num = doc.ComputeStatistics(Word.WdStatistic.wdStatisticPages, Type.Missing);
        int[] a = { 5, 3, 1 };
        for (int i = 0; i < a.Length; i++)
        {
            object page_num = a[i];
            Globals.ThisAddIn.Application.Selection.GoTo(Word.WdGoToItem.wdGoToPage, Word.WdGoToDirection.wdGoToAbsolute, num, page_num);
            Globals.ThisAddIn.Application.Selection.Bookmarks[@"\Page"].Select();
            Globals.ThisAddIn.Application.Selection.Delete();
        }
        Globals.ThisAddIn.Application.Options.AllowReadingMode = true;
    }

希望这对您有所帮助。我上面的示例来自应用程序级别插件。我在 2013 年对其进行了测试,它似乎有效