Este artículo proviene de un motor de traducción automática.

OneNote 2010

Creación de las extensiones de 2010 de OneNote con el modelo de objetos de OneNote

Andy Gray

Descargar el ejemplo de código

Microsoft Office OneNote es un bloc de notas digital eficaz para recopilar, organizar, buscar y compartir información. Con la versión más reciente de Microsoft Office 2010, no sólo se ha mejorado la experiencia de usuario de OneNote, pero los blocs de notas de OneNote están ahora disponibles universalmente más. Los usuarios pueden sincronizar contenido entre los equipos a través de Windows Live; buscar, editar y compartir notas desde cualquier explorador Web; y tener acceso a blocs de notas completos de Windows Mobile (y, muy pronto, 7 de teléfono de Windows). Además, OneNote se incluyó anteriormente sólo en algunas ediciones de Office, pero es ahora en todas las ediciones de Office de 2010. Todos estos factores crea una oportunidad más atractivas y que nunca la integración de OneNote en soluciones de administración de información.

En este artículo, proporcionaré información general acerca del desarrollo de aplicaciones que interactúan con los datos de Microsoft OneNote 2010 y 2007. En el proceso, presentaré el proyecto de modelo de objetos de OneNote en el que está disponible gratuitamente en CodePlex y demostrar cómo esta biblioteca facilita la integración de la información de los blocs de notas, secciones y páginas de OneNote en aplicaciones de cliente.

La evolución del desarrollo de OneNote

La versión inicial de OneNote 2003 no ofrecía una API a las aplicaciones externas. Sin embargo, poco después, OneNote 2003 Service Pack 1 agrega una biblioteca COM, que se llama a la biblioteca de tipos de OneNote 1.1, que habilita la programación de importación de entradas manuscritas, imágenes y el código HTML en OneNote a través de una clase simple denominada CSimpleImporter. En particular, sin embargo, esta clase sólo proporciona capacidades de importación de datos; puede utilizar para insertar datos en los blocs de notas de OneNote, pero no había forma de obtener contenido mediante programación.

La versión de OneNote 2007 se ha puesto mucho más eficaces capacidades de desarrollo con una nueva API de COM que proporciona la capacidad de importar, exportar y modificar el contenido de OneNote 2007 mediante programación. La clase de aplicación de OneNote en dicha biblioteca proporciona una amplia colección de métodos para trabajar con:

  • Estructura del Bloc de notas: descubrir, abrir, modificar, cerrar y eliminar secciones, grupos de secciones y blocs de notas
  • Página de contenido: descubrir, abrir, modificar, guardar y eliminar el contenido de la página
  • Exploración: buscar, vincular a y, a las páginas y objetos

La mayoría de estos métodos devuelve o acepta documentos XML que representan la estructura del Bloc de notas y el contenido de la página. Saul Candib ha escrito una serie de dos partes, “ lo del día de nuevo para programadores en OneNote 2007, ” que documenta esta API en msdn.microsoft.com/library/ms788684(v=office.12)de y el esquema XML se detalla en la de msdn.microsoft.com/library/aa286798(office.12) .

El esquema XML de OneNote 2010 es bastante similar a la de OneNote 2007. OneNote 2010 presenta un cambio de formato de archivo para admitir algunas de sus nuevas características (como, por ejemplo, notas vinculadas, el control de versiones, las subpáginas de varios niveles, de uso compartidas de Web y compatibilidad con la ecuación). Sin embargo, puede continuar 2010 de OneNote trabajen en blocs de notas de OneNote 2007 sin cambiar el formato de archivo. En OneNote 2010, recuperar datos de las secciones que se almacenan en el formato de archivo de OneNote 2007 dará como resultado documentos XML similares a las de OneNote 2007. Las principales diferencias en el esquema XML para las secciones de OneNote 2010 son aditivos cambios para admitir las nuevas características enumeradas anteriormente. Hay una nueva enumeración de esquema XML representar la versión del esquema de OneNote; muchos de los métodos de OneNote nuevas sobrecargas que toman un parámetro de esquema XML para indicar la versión de esquema que desea.

Tenga en cuenta que la clase CSimpleImporter, presentado en OneNote 2003 y seguirá estando disponible en OneNote 2007, se ha quitado de 2010 en OneNote, por lo que las aplicaciones que utilizan esta clase es necesario volver a escribir para utilizar las nuevas interfaces para trabajar con OneNote 2010.

Acceso a datos de OneNote con la API de COM

Es bastante sencillo empezar a utilizar la API de COM de OneNote para tener acceso a datos activos de blocs de notas de OneNote. Empiece por crear una nueva aplicación de consola en Visual Studio y, a continuación, agregue una referencia al componente COM de Microsoft OneNote 14.0 Type Library (para OneNote 2010) o el componente COM de Microsoft OneNote 12.0 Type Library (de OneNote 2007).

Si utiliza 2010 de Visual Studio para desarrollar aplicaciones de OneNote 2010, tome nota de un par de problemas de compatibilidad poco importantes. En primer lugar, debido a una falta de coincidencia de que el ensamblado de interoperabilidad de OneNote que se incluye con Visual Studio de 2010, debe the
Microsoft.Office.Interop.OneNote el componente en la ficha .NET del cuadro de diálogo Agregar referencia de la referencia no directamente; en su lugar haga referencia al componente de biblioteca de tipos de Microsoft OneNote 14.0 en la ficha COM. El resultado sigue la adición de un ensamblado de interoperabilidad de OneNote para las referencias del proyecto.

En segundo lugar, la biblioteca de tipos de OneNote 14.0 no es compatible con la característica de Visual Studio 2010 “ NOPIA ” (en los ensamblados de interoperabilidad primario no se incrustan en la aplicación de forma predeterminada). Por lo tanto, asegúrese de establecer la propiedad de los tipos de interoperabilidad de incrustar en False para la referencia de ensamblado de interoperabilidad de OneNote. (Estos problemas se describen con más detalle en el blog de la del Administrador de programas de OneNote Daniel Escapa en blogs.msdn.com/descapa/archive/2010/04/27/onenote-2010-and-visual-studio-2010-compatibility-issues.aspx de ). Con la referencia de biblioteca de OneNote en su lugar, está listo para realizar llamadas a la API de OneNote. El código en de figura 1 utiliza el método de GetHierarchy para recuperar un documento XML que contiene una lista de blocs de notas de OneNote, a continuación, usa LINQ to XML para extraer e imprimir los nombres de Bloc de notas en la consola.

Figura 1 de Enumerar blocs de notas

using System;
using System.Linq;
using System.Xml.Linq;
using Microsoft.Office.Interop.OneNote;

class Program
{
  static void Main(string[] args)
  {
    var onenoteApp = new Application();

    string notebookXml;
    onenoteApp.GetHierarchy(null, HierarchyScope.hsNotebooks, out notebookXml);
    
    var doc = XDocument.Parse(notebookXml);
    var ns = doc.Root.Name.Namespace;
    foreach (var notebookNode in 
      from node in doc.Descendants(ns + "Notebook") select node)
    {
      Console.WriteLine(notebookNode.Attribute("name").Value);
    }
  }
}

La enumeración HierarchyScope, que se pasa como segundo parámetro del método GetHierarchy, especifica la profundidad de la estructura del Bloc de notas para recuperar. Para recuperar las secciones también en los equipos portátiles, actualizar este valor de enumeración a HierarchyScope.hsSections y procesar los nodos de secundarios XML adicionales, como se demostró en de figura 2.

La figura 2 de Enumerar las secciones

using System;
using System.Linq;
using System.Xml.Linq;
using Microsoft.Office.Interop.OneNote;

class Program
{
  static void Main(string[] args)
  {
    var onenoteApp = new Application();

    string notebookXml;
    onenoteApp.GetHierarchy(null, HierarchyScope.hsSections, out notebookXml);
    
    var doc = XDocument.Parse(notebookXml);
    var ns = doc.Root.Name.Namespace;
    foreach (var notebookNode in from node in doc.Descendants(ns + 
      "Notebook") select node)
    {
      Console.WriteLine(notebookNode.Attribute("name").Value);
      foreach (var sectionNode in from node in 
        notebookNode.Descendants(ns + "Section") select node)
      {
        Console.WriteLine("  " + sectionNode.Attribute("name").Value);
      }
    }
  }
}

Recuperar y actualizar el contenido de la página

El método GetPageContent devolverá un documento XML que contiene todo el contenido de una página especificada. Para especificar la página para recuperar mediante un identificador de objeto de OneNote, un identificador único para cada objeto de la jerarquía de Bloc de notas de OneNote en función de cadena. Este ID. de objeto se incluye como un atributo en los nodos XML devuelto por el método GetHierarchy.

La figura 3 se basa en los ejemplos anteriores mediante el método GetHierarchy para recuperar la jerarquía del Bloc de notas de OneNote a ámbito de la página. A continuación, se usa LINQ to XML para seleccionar el nodo de la página denominada “ página de prueba ” y pasar el identificador de objeto de esa página para el método GetPageContent. A continuación, se imprime el documento XML que representa el contenido de la página en la consola.

La figura 3 de contenido de la página de introducción

using System;
using System.Linq;
using System.Xml.Linq;
using Microsoft.Office.Interop.OneNote;

class Program
{
  static void Main(string[] args)
  {
    var onenoteApp = new Application();

    string notebookXml;
    onenoteApp.GetHierarchy(null, HierarchyScope.hsPages, out notebookXml);

    var doc = XDocument.Parse(notebookXml);
    var ns = doc.Root.Name.Namespace;
    var pageNode = doc.Descendants(ns + "Page").Where(n => 
      n.Attribute("name").Value == "Test page").FirstOrDefault();
    if (pageNode != null)
    {
      string pageXml;
      onenoteApp.GetPageContent(pageNode.Attribute("ID").Value, out pageXml);
      Console.WriteLine(XDocument.Parse(pageXml));
    }
  }
}

El método UpdatePageContent puede utilizarse para realizar cambios en una página. El contenido de la página especificado por el mismo esquema de documento XML que recupera el código en de figura 3; puede contener varios elementos de contenido que definen los contornos de texto, los archivos insertados, imágenes, entradas manuscritas y archivos de audio o vídeo.

El método UpdatePageContent trata los elementos en el documento XML proporcionado como una colección de contenido que haya cambiado, que coincide con el contenido especificado en el contenido actual a través de su OneNote Id. de objeto Por lo tanto, puede realizar cambios en el contenido actual llamando al método GetPageContent, realizar los cambios que desee para el XML devuelto, a continuación, hacer pasando ese código XML de seguridad para el método UpdatePageContent. También puede especificar los elementos de contenido nuevos que se agregará a la página.

Para ilustrarlo, de figura 4 se agrega una marca de fecha a la parte inferior de la página de prueba. El enfoque mostrado en de figura 3 se utiliza para determinar el identificador de objeto de OneNote de la página y, a continuación, utiliza las clases de XDocument y XElement en System.Xml.Linq para construir un documento XML que contiene el nuevo contenido. Dado que el identificador de objeto de página especificado en el documento coincide con el identificador de objeto de una página existente, el método UpdatePageContent agregará el nuevo contenido a la página existente.

La figura 4 del Contenido de la página Actualizar

using System;
using System.Linq;
using System.Xml.Linq;
using Microsoft.Office.Interop.OneNote;

class Program
{
  static void Main(string[] args)
  {
    var onenoteApp = new Application();

    string notebookXml;
    onenoteApp.GetHierarchy(null, HierarchyScope.hsPages, out notebookXml);

    var doc = XDocument.Parse(notebookXml);
    var ns = doc.Root.Name.Namespace;
    var pageNode = doc.Descendants(ns + "Page").Where(n => 
      n.Attribute("name").Value == "Test page").FirstOrDefault();
    var existingPageId = pageNode.Attribute("ID").Value;

    if (pageNode != null)
    {
      var page = new XDocument(new XElement(ns + "Page", 
                                 new XElement(ns + "Outline", 
                                   new XElement(ns + "OEChildren", 
                                     new XElement(ns + "OE", 
                                       new XElement(ns + "T", 
                                         new XCData("Current date: " +
                                           DateTime.Now.
                                             ToLongDateString())))))));
       page.Root.SetAttributeValue("ID", existingPageId);
       onenoteApp.UpdatePageContent(page.ToString(), DateTime.MinValue);
    }
  }
}

La biblioteca de modelo de objetos de OneNote

No es especialmente difícil interactuar con datos de OneNote de esta forma, pero es un poco complicado analizar y construir documentos XML sólo para realizar operaciones de base de datos. Que es donde entra en juego el modelo de objetos de OneNote. Es una biblioteca de código administrado que proporciona abstracciones orientado a objetos a través de la API basadas en COM de OneNote. La biblioteca es código abierto y con licencia bajo la licencia pública de Microsoft (MS-PL).

El modelo de objetos de OneNote está disponible para su descarga en CodePlex en onom.codeplex.com. Se ha diseñado la biblioteca de OneNote 2007 y en el momento en que se lea esto, las descargas de la versión deben actualizarse para proporcionar compatibilidad con OneNote 2010. En caso contrario, se puede usarlo con secciones de OneNote 2007 en OneNote 2010 por descargar el código fuente, eliminando la referencia de ensamblado Microsoft.Office.Interop.OneNote existente en el proyecto OneNoteCore y agregar una referencia a la biblioteca de tipos de Microsoft OneNote 14.0 tal como se muestra anteriormente.

Además de algunos proyectos de prueba de unidad y el código de ejemplo, la solución contiene dos proyectos de biblioteca de clases: OneNoteCore y OneNoteFramework. La biblioteca de OneNoteCore está entre las API de COM de OneNote y familiar de Microsoft .NET Framework de metáforas relacionadas con el puente de Low nivel, expone los valores reales en lugar de COM parámetros out, convierte los códigos de error de COM a excepciones. NET, expone una estructura OneNoteObjectId y las instancias de XDocument en lugar de cadenas sin formato y mucho más. Estudio de este código puede ayudarle a comprender el funcionamiento de la API de OneNote, pero en muchos casos no necesitará interactuar directamente con la biblioteca de OneNoteCore.

La biblioteca de OneNoteFramework proporciona abstracciones de nivel superior de los conceptos de OneNote. A continuación, encontrará que las clases con nombres intuitivos como OneNoteNotebook, OneNoteSection y OneNotePage. El punto de entrada principal para interactuar con la estructura de jerarquía de OneNote es una clase denominada OneNoteHierarchy, que contiene a un miembro estático denominado actual. Al agregar una referencia de ensamblado a la biblioteca de OneNoteFramework, se puede rescribir a nuestro programa para enumerar los nombres de Bloc de notas ( de figura 1) una manera mucho más precisa como sigue:

using Microsoft.Office.OneNote;

class Program
{
  static void Main(string[] args)
  {
    foreach (var notebook in OneNoteHierarchy.Current.Notebooks)
      System.Console.WriteLine(notebook.Name);
  }
}

Como cabría esperar, la clase OneNoteNotebook tiene una propiedad denominada secciones. Por lo tanto, puede enumerar los nombres de sección ( de figura 2) simplemente como sigue:

using Microsoft.Office.OneNote;

class Program
{
  static void Main(string[] args)
  {
    foreach (var notebook in OneNoteHierarchy.Current.Notebooks)
    {
      System.Console.WriteLine(notebook.Name);
      foreach (var section in notebook.Sections)
      {
        System.Console.WriteLine("  " + section.Name);
      }
    }
  }
}

Administran colecciones expuestos por las propiedades de modelo de objetos de OneNote con una clase de colección genérico especializado llamada OneNoteObjectCollection <T>. Debido a que OneNoteObjectCollection <T> implementa IList <T>, además de IEnumerable <T>, estas colecciones se pueden consultar mediante LINQ.

Por ejemplo, dada una referencia a una instancia de OneNoteSection en la variable de la sección, se ha podido determinar todas las páginas que se ha modificado en la actualidad con una expresión sencilla de LINQ similar al siguiente:

var pagesModifiedToday = from page in section.Pages 
                           where page.LastModifiedTime >= DateTime.Today 
                           select page;

Enlace de datos con la biblioteca del modelo de objetos de OneNote

El hecho de que el modelo de objetos de OneNote expone colecciones de IEnumerable también permite al enlace de datos basadas en XAML con Windows Presentation Foundation (WPF). La figura 5 d muestra el uso del enlace de datos para mostrar un control TreeView de WPF de la jerarquía de Bloc de notas de OneNote exclusivamente en el marcado XAML, sin requerir el uso de código subyacente.

La figura 5 de enlace de datos con Windows Presentation Foundation

<Window x:Class="NotebookTree.MainWindow"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:onf="clr-namespace:Microsoft.Office.OneNote;assembly=
          OneNoteFramework"
        Title="OneNote Notebook Hierarchy" >
  <Grid>
    <Grid.Resources>
      <DataTemplate x:Key="PageTemplate">
        <StackPanel Orientation="Horizontal">
          <Image Source="Images\Page16.png" Margin="0,0,2,0"/>
          <TextBlock Text="{Binding Name}" />
        </StackPanel>
      </DataTemplate>
            
      <HierarchicalDataTemplate x:Key="SectionTemplate" 
        ItemsSource="{Binding Pages}"
        ItemTemplate="{StaticResource PageTemplate}">
        <StackPanel Orientation="Horizontal">
          <Image Source="Images\Section16.png" Margin="0,0,2,0"/>
          <TextBlock Text="{Binding Name}" />
        </StackPanel>
      </HierarchicalDataTemplate>
            
      <HierarchicalDataTemplate x:Key="NotebookTemplate" 
        ItemsSource="{Binding Sections}"
        ItemTemplate="{StaticResource SectionTemplate}">
        <StackPanel Orientation="Horizontal">
          <Image Source="Images\Book16.png" Margin="0,0,2,0"/>
          <TextBlock Text="{Binding Name}" />
        </StackPanel>
      </HierarchicalDataTemplate>
    </Grid.Resources>
        
    <TreeView Name="NotebookTree" BorderThickness="0"
              HorizontalAlignment="Left" VerticalAlignment="Top"
              ItemsSource="{Binding Notebooks}" 
              ItemTemplate="{StaticResource NotebookTemplate}" 
              DataContext="{Binding Source={x:Static 
                onf:OneNoteHierarchy.Current}}" />
  </Grid>
</Window>

Este XAML en primer lugar hace referencia el ensamblado OneNoteFramework, lo que el de onf la prefijo de espacio de nombres XML .Con esta referencia en su lugar, el DataContext de TreeView, a continuación, se puede establecer para la propiedad estática Current de la clase OneNoteHierarchy, que proporciona el control con la raíz de la estructura de jerarquía de OneNote.HierarchicalDataTemplates, a continuación, se utilizan para enlazar los datos expuesto de cada nivel del árbol con la colección correspondiente mediante el modelo de objetos de OneNote (consulte de figura 6).

image: Data Binding the Hierarchy to a Tree View

La figura 6 de la jerarquía a una vista de árbol de enlace de datos

Simplificada de acceso a datos

Ajustar hacia arriba, la biblioteca del modelo de objetos de OneNote simplifica considerablemente el acceso a datos en blocs de notas de OneNote de Microsoft, la exposición de las colecciones de objetos completo que se pueden consultar y manipular con expresiones LINQ y el enlace de datos WPF.Un artículo de seguimiento extenderá estos conceptos para explorar trabaja con blocs de notas de OneNote en las aplicaciones de Silverlight y el teléfono de Windows y obtener acceso a datos de OneNote en la nube.

Andy Gray es un director de asociados de negocios y tecnología de software de talento cinco, lo que ayuda a las organizaciones sin ánimo de lucro que funcionar más eficazmente a soluciones de tecnología estratégica. Escribe acerca del desarrollo de OneNote en onenotedev.com de .

Gracias a los siguientes expertos técnicos de este artículo: Michael Gerfen y John Guin.