kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

OneNoteをCOMで使う4回目

OneNoteをCOMで使う3回目 - 新日々此何有哉
ノートブックのアクセスができることはわかったので、次は各ページのコンテンツを取得してみます。Windows + Sキーで採取したハードコピーは落書きノートに入ることがわかっています。余談ですが、私はWindows Clippingsで撮ったハードコピーもOneNoteに送っています。
では、落書きノートはどうやって探すのでしょう?XMLを見るとノードのなかの配下の要素がそれらしいことがわかりますので、LINQ to XMLで取得します。

  String strXML = default(string);
  onApplication.GetHierarchy(null, HierarchyScope.hsPages, out strXML);
  var oneNoteXML = XDocument.Parse(strXML);
  XNamespace oneNoeteIns = "http://schemas.microsoft.com/office/onenote/2007/onenote";

  var noteBooks = from p in 
    oneNoteXML.Root.Elements(oneNoeteIns + "UnfiledNotes").Elements(oneNoeteIns + "Section").Elements()
                  select p;

んで、MSDNによると、GetPageContentかGetBinaryPageContentを使えばよさそうです。

  string pageID = default(string);
  string pageXmlOut = default(string);
            
  foreach (var book in noteBooks){
    pageID = (string) book.Attribute("ID");
    onApplication.GetPageContent(pageID, out pageXmlOut, PageInfo.piAll);
  }

ハードコピーがページ単位に入っているので、png画像しかないとわかっていますが、とりあえずGetPageContentで取得すると、第二引数にXML形式でこんなデータが取得できます。

要素配下にpng形式がBase64エンコードされた形式で格納されていることがわかります(さきほどのMSDNより)。あとはこのの値をBase64でデコードした上でファイルに保存すればスクリーンショットのPNGが取得できます。ということで、ここまでできたので、次回はツールにしてみます。