Share via


Abrir un documento de procesamiento de texto para acceso de solo lectura

En este tema se describe cómo usar las clases del SDK de Open XML para Office para abrir mediante programación un documento de procesamiento de texto con acceso de solo lectura.


Cuándo se debe abrir un documento para acceso de solo lectura

A veces, se desea abrir un documento para inspeccionar o recuperar algo de información, y se quiere hacer de manera que se garantice que el documento permanezca sin cambios. En estos casos, la idea es abrir el documento para acceso de solo lectura. En este tema de procedimientos se abordan diversas formas de abrir mediante programación un documento de procesamiento de texto de solo lectura.


Creación de un objeto WordprocessingDocument

En Open XML SDK, la clase WordprocessingDocument representa un paquete de documentos de Word. Para trabajar con un documento de Word, primero cree una instancia de la clase WordprocessingDocument a partir del documento y, a continuación, trabaje con esa instancia. Una vez creada la instancia a partir del documento, puede obtener acceso al elemento de documento principal que contiene el texto del documento. Cada paquete de Office Open XML contiene cierto número de elementos. Como mínimo, un WordProcessingDocument debe contener una parte de documento principal que cumpla la función de contenedor para el texto principal del documento. El paquete también puede contener elementos adicionales. Tenga en cuenta que en un documento de Word, el texto en el elemento de documento principal se representa en el paquete como XML mediante marcado de WordprocessingML.

Para crear la instancia de clase a partir del documento, llame a uno de los métodos Open. Se proporcionan varios métodos Open, cada uno de los cuales tiene una firma distinta. En la siguiente tabla, se incluye una lista de los métodos que permiten especificar si un documento se puede editar.

Método Open Tema de referencia de la biblioteca de clases Descripción
Open(String, Boolean) Open(String, Boolean) Crear una instancia de la clase WordprocessingDocument desde el archivo especificado.
Open(Stream, Boolean) Open(Stream, Boolean) Crear una instancia de la clase WordprocessingDocument desde la secuencia de E/S especificada.
Open(String, Boolean, OpenSettings) Open(String, Boolean, OpenSettings) Crear una instancia de la clase WordprocessingDocument desde el archivo especificado.
Open(Stream, Boolean, OpenSettings) Open(Stream, Boolean, OpenSettings) Crear una instancia de la clase WordprocessingDocument desde la secuencia de E/S especificada.

En la tabla anterior, solo se incluyen aquellos métodos Open que aceptan un valor booleano como segundo parámetro para especificar si un documento se puede editar. Para abrir un documento para acceso de solo lectura, especifique este parámetro como falso.

Tenga en cuenta que dos de los métodos Open crean una instancia de la clase WordprocessingDocument basándose en una cadena como el primer parámetro. El primer ejemplo del código de ejemplo usa esta técnica. En él, se usa el primer método Open en la tabla anterior; con una firma que requiere dos parámetros. El primer parámetro toma una cadena que representa un nombre de archivo con ruta completa desde la que se quiere abrir el documento. El segundo parámetro es true o false; en este ejemplo, se usa false y se indica si desea abrir el archivo para editarlo.

El siguiente código de ejemplo llama al método Open.

    // Open a WordprocessingDocument for read-only access based on a filepath.
    using (WordprocessingDocument wordDocument =
        WordprocessingDocument.Open(filepath, false))

Los otros dos métodos Open crean una instancia de la clase WordprocessingDocument basándose en una secuencia de entrada y salida. Puede emplear este enfoque, por ejemplo, si tiene una aplicación de Microsoft SharePoint Foundation 2010 que usa entrada y salida de secuencias y desea usar el SDK de Open XML para trabajar con un documento.

El siguiente código de ejemplo abre un documento basándose en una secuencia.

    Stream stream = File.Open(strDoc, FileMode.Open);
    // Open a WordprocessingDocument for read-only access based on a stream.
    using (WordprocessingDocument wordDocument =
        WordprocessingDocument.Open(stream, false))

Supongamos que tiene una aplicación que emplea la compatibilidad con Open XML en el espacio de nombres System.IO.Packaging de la biblioteca de clases de .NET Framework y que desea usar el SDK de Open XML para trabajar con un paquete de solo lectura. Aunque el SDK de Open XML incluye sobrecargas de método que aceptan un paquete como primer parámetro, no hay uno que tome un valor booleano como segundo parámetro para indicar si el documento debe abrirse para su edición.

El método recomendado consiste en, primero, abrir el paquete en modo de solo lectura para, a continuación, crear la instancia de la clase WordprocessingDocument, como aparece en el segundo ejemplo del código de muestra. El siguiente ejemplo de código realiza esta operación.

    // Open System.IO.Packaging.Package.
    Package wordPackage = Package.Open(filepath, FileMode.Open, FileAccess.Read);

    // Open a WordprocessingDocument based on a package.
    using (WordprocessingDocument wordDocument =
        WordprocessingDocument.Open(wordPackage))

Después de abrir el paquete de documentos de Word, se puede tener acceso al elemento de documento principal. Para tener acceso al cuerpo del elemento de documento principal, se asigna una referencia al cuerpo del documento existente, tal como se muestra en el siguiente ejemplo de código.

    // Assign a reference to the existing document body.
    Body body = wordprocessingDocument.MainDocumentPart.Document.Body;

Estructura de un documento WordProcessingML

La estructura de documento básica de un documento WordProcessingML contiene los elementos document y body, seguidos de uno o varios elementos a nivel de bloque, como p, que representa un párrafo. Un párrafo contiene uno o varios elementos r. La r representa a run (segmento), que es una región de texto con un conjunto de propiedades comunes, como el formato. Un segmento contiene uno o varios elementos t. El elemento t contiene un intervalo de texto. En el siguiente ejemplo de código se muestra el marcado WordprocessingML de un documento que contiene el texto "Example text".

    <w:document xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
      <w:body>
        <w:p>
          <w:r>
            <w:t>Example text.</w:t>
          </w:r>
        </w:p>
      </w:body>
    </w:document>

Con el SDK de Open XML, puede crear contenido y estructura de documentos mediante clases fuertemente tipadas que corresponden a elementos WordprocessingML . Puede encontrar estas clases en el espacio de nombres DocumentFormat.OpenXml.Wordprocessing . La tabla siguiente muestra los nombres de las clases que corresponden a los elementos document, body, p, r y t.

Elemento de WordprocessingML Open XML SDK (clase) Descripción
documento Document El elemento raíz del elemento de documento principal.
body Body El contenedor de las estructuras a nivel de bloque, como párrafos, tablas, anotaciones y otras recogidas en la especificación ISO/IEC 29500.
p Paragraph Un párrafo.
r Run Un segmento.
t Text Un intervalo de texto.

Para obtener más información sobre la estructura general de los elementos y elementos de un documento WordprocessingML, vea Estructura de un documento WordprocessingML.


Generación del marcado de WordprocessingML para agregar texto e intentar guardar

El código de ejemplo muestra cómo se puede agregar texto e intentar guardar los cambios para mostrar que el acceso es de solo lectura. Una vez que se tiene acceso al cuerpo del elemento de documento principal, se agrega el texto mediante la adición de instancias de las clases Paragraph, Run y Text. Esto genera el marcado de WordprocessingML necesario. El siguiente ejemplo de código agrega el párrafo, segmento y texto.

    // Attempt to add some text.
    Paragraph para = body.AppendChild(new Paragraph());
    Run run = para.AppendChild(new Run());
    run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingDocumentReadonly"));

    // Call Save to generate an exception and show that access is read-only.
    wordDocument.MainDocumentPart.Document.Save();

Código de ejemplo

El primer método de ejemplo que aparece aquí, OpenWordprocessingDocumentReadOnly, abre un documento de Word para acceso de solo lectura. Al llamar al método, se debe pasar la ruta completa del archivo que se desea abrir. Por ejemplo, el siguiente ejemplo de código abre el archivo Word12.docx ubicado en la carpeta de documentos públicos para acceso de solo lectura.

    OpenWordprocessingDocumentReadonly(@"c:\Users\Public\Public Documents\Word12.docx");

El segundo método de ejemplo, OpenWordprocessingPackageReadonly, muestra cómo abrir un documento de Word para acceso de solo lectura desde System.IO.Packaging.Package. Al llamar al método, se debe pasar una ruta completa al archivo que desea abrir. Por ejemplo, el siguiente código abre el archivo Word12.docx ubicado en la carpeta de documentos públicos para acceso de solo lectura.

    OpenWordprocessingPackageReadonly(@"c:\Users\Public\Public Documents\Word12.docx");

Importante

[!IMPORTANTE] Si se quita un comentario de la instrucción que guarda el archivo, el programa genera una IOException, porque el archivo está abierto para acceso de solo lectura.

A continuación se proporciona el código de ejemplo completo en C# y VB.


using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;

OpenWordprocessingDocumentReadonly(args[0]);

static void OpenWordprocessingDocumentReadonly(string filepath)
{
    // Open a WordprocessingDocument based on a filepath.
    using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(filepath, false))
    {
        if (wordDocument is null)
        {
            throw new ArgumentNullException(nameof(wordDocument));
        }
        // Assign a reference to the existing document body.
        MainDocumentPart mainDocumentPart = wordDocument.MainDocumentPart ?? wordDocument.AddMainDocumentPart();
        mainDocumentPart.Document ??= new Document();

        Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());

        // Attempt to add some text.
        Paragraph para = body.AppendChild(new Paragraph());
        Run run = para.AppendChild(new Run());
        run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingDocumentReadonly"));

        // Call Save to generate an exception and show that access is read-only.
        //mainDocumentPart.Document.Save();
    }
}

Vea también