MSDN OneNote Api:导航到从未打开过的页面,而不打开OneNote应用程序窗口



我的目标是能够使用c#以编程方式打开任何。一个节文件,并获得该节的所有页面id。在一个简单的情况下(我已经创建并最近使用了该部分),可以使用以下代码完成:

using Microsoft.Office.Interop.OneNote;
class Program
{
    public static void ProcessOnenoteFile()
    {
        Application onenoteApp = new Application();
        string filepath = @"C:UsersAdminDocumentsOneNote NotebooksMy Notebooktestsection.one";
        string sectionId;
        onenoteApp.OpenHierarchy(filepath, null, out sectionId);
        string hierarchy;
        onenoteApp.GetHierarchy(sectionId, HierarchyScope.hsPages, out hierarchy);
        File.WriteAllText(@"C:hierarchy.txt", hierarchy);
    }
}

从这里我可以解析xml找到所有的pageid,我很好去。

问题是,然而,我想对我从别人那里得到的文件做这个,以前从未打开过。当我在这些文件上运行相同的代码时,我无法在层次结构中找到任何pageid,因此,我无法处理任何页面。一个似乎有效的修复方法是在试图获得层次结构之前使用navigateTo方法打开OneNote中的section文件。

 ...
 string sectionId;
 onenoteApp.OpenHierarchy(filepath, null, out sectionId);
 onenoteApp.NavigateTo(sectionId);
 string hierarchy
 ...

然而,这是相当恼人的,因为我需要打开OneNote应用程序。由于我有许多.one节文件要处理,它会有很多随机信息在屏幕上闪烁,这是不必要的,可能会使我的程序的最终用户感到困惑。是否有一种方法可以实现将pageid添加到层次结构的相同结果,而无需打开OneNote应用程序?至少,我有办法隐藏应用程序吗?

更新:

我刚刚注意到,使用Publish命令也会用pageIds更新层次结构,但是,这种解决方案仍然不理想,因为它需要我制作另一个文件。

此外,更仔细地查看xml导出,我看到有一个名为"areAllPagesAvailable"的属性,该属性在我尚未在OneNote中打开的所有文件上设置为false。

哇!经过几个小时的玩弄和谷歌搜索不同的方法,我找到了我想要的。

解决方案:SyncHierarchy (sectionId);

...
        string sectionId;
        onenoteApp.OpenHierarchy(onenoteFile, null, out sectionId, CreateFileType.cftSection);
        onenoteApp.SyncHierarchy(sectionId);
        string hierarchy;
        onenoteApp.GetHierarchy(sectionId, HierarchyScope.hsPages, out hierarchy);
...

最新更新