Share via


Establecer la fuente de una ejecución de texto

En este tema se muestra cómo usar las clases del SDK de Open XML para Office para establecer la fuente de una parte del texto dentro de un documento de procesamiento de texto mediante programación.


Partes de documento y paquetes

Un documento Office Open XML se almacena como un paquete, cuyo formato se define mediante ISO/IEC 29500-2. El paquete puede incluir varias partes con relaciones entre ellas. La relación entre las partes controla la categoría del documento. Un documento puede definirse como un documento de procesamiento de texto si su elemento de relación de paquete contiene una relación con una parte de documento principal. Si su elemento de relación de paquete contiene una relación con una parte de presentación, puede definirse como un documento de presentación. Si su elemento de relación de paquete contiene una relación con una parte de libro, se define como un documento de hoja de cálculo. En este tema sobre procedimientos se usará un paquete de documentos de procesamiento de texto.


Creación de un objeto WordprocessingDocument

En el ejemplo de código se abre un paquete de documentos de procesamiento de texto pasando un nombre de archivo como argumento a uno de los métodos Open() sobrecargados de la clase WordprocessingDocument que toma una cadena y un valor booleano que especifica si el archivo debe abrirse en modo de lectura y escritura o no. En este caso, el valor booleano es true, lo que indica que el archivo debe abrirse en modo de lectura y escritura.

    // Open a Wordprocessing document for editing.
    using (WordprocessingDocument package = WordprocessingDocument.Open(fileName, true))
    {
        // Insert other code here.
    }

La instrucción using proporciona una alternativa recomendada a la típica secuencia .Create, .Save, .Close. Asegura que se llamará automáticamente al método Dispose (un método interno que Open XML SDK usa para limpiar recursos) cuando se llegue a la llave de cierre. El bloque que sigue a la instrucción using establece un ámbito para el objeto que se crea o se nombra en la instrucción using, en este caso package. Dado que la clase WordprocessingDocument en Open XML SDK guarda y cierra el objeto automáticamente como parte de su implementación System.IDisposable, y dado que se llama automáticamente a Dispose cuando sale del bloque, no necesita llamar explícitamente a Save y Close, siempre que use using.


Estructura del elemento de fuentes de segmento

El siguiente texto de la especificación ISO/IEC 29500 puede ser útil cuando se trabaja con el elemento rFonts.

Este elemento especifica las fuentes que se deben usar para mostrar el contenido de texto de este segmento. Dentro de un solo segmento, puede haber hasta cuatro tipos de contenido presentes, cada uno de los cuales debe poder usar una única fuente:

  • ASCII

  • ANSI alto

  • Escritura compleja

  • Asia oriental

El uso de cada una de estas fuentes se determinará por los valores de caracteres Unicode con el contenido del segmento, a menos que se invaliden manualmente mediante el uso del elemento cs.

Si este elemento no está presente, el valor predeterminado es dejar el formato aplicado al nivel anterior en la jerarquía de estilos. Si este elemento nunca se aplica en la jerarquía de estilos, el texto deberá mostrarse en cualquier fuente predeterminada que admita cada tipo de contenido.

Considere un solo segmento de texto con texto en árabe y en inglés, de la siguiente forma:

English العربية

Este contenido se puede expresar en un solo segmento de WordprocessingML:

    <w:r>
      <w:t>English العربية</w:t>
    </w:r>

Aunque está en el mismo segmento, el contenido se encuentra en diferentes fuentes mediante la especificación de una fuente distinta para caracteres ASCII y CS en el segmento:

    <w:r>
      <w:rPr>
        <w:rFonts w:ascii="Courier New" w:cs="Times New Roman" />
      </w:rPr>
      <w:t>English العربية</w:t>
    </w:r>

Por lo tanto, este segmento de texto debe usar la fuente Courier New para todos los caracteres del rango ASCII y debe usar la fuente Times New Roman para todos los caracteres del rango de escritura compleja.

© ISO/IEC29500: 2008.


Funcionamiento del código de ejemplo

Tras abrir el archivo de paquete para lectura y escritura, el código crea un objeto RunProperties que contiene un objeto RunFonts que tiene su propiedad Ascii establecida en "Arial". Los objetos RunProperties y RunFonts representan elementos de propiedades de ejecución (<rPr>) y ejecutan elementos de fuentes (<rFont>), respectivamente, en el esquema Wordprocessing de Open XML. Use un objeto RunProperties para especificar las propiedades de un segmento de texto determinado. En este caso, para establecer la fuente del segmento en Arial, el código crea un objeto RunFonts y, a continuación, establece el valor Ascii en "Arial".

    // Use an object initializer for RunProperties and rPr.
    RunProperties rPr = new RunProperties(
        new RunFonts()
        {
            Ascii = "Arial"
        });

A continuación, el código crea un objeto Run que representa el primer segmento de texto del documento. El código crea una instancia de Run y la establece en el primer segmento de texto del documento. A continuación, el código agrega el objeto RunProperties al objeto Run mediante el método T>(T) PrependChild<. El método PrependChild agrega un elemento como el primer elemento secundario al elemento especificado en la estructura XML en memoria. En este caso, el segmento del ejemplo de código produce una estructura XML en memoria donde el elemento RunProperties se agrega como el primer elemento secundario del elemento Run. A continuación, guarda los cambios en el objeto Save(MainDocumentPart). Al llamar al método Save del objeto WordprocessingDocument , se confirman los cambios realizados en la representación en memoria de la parte MainDocumentPart en el archivo XML de MainDocumentPart (el archivo document.xml del paquete Wordprocessing).

    Run r = package.MainDocumentPart.Document.Descendants<Run>().First();
    r.PrependChild<RunProperties>(rPr);

    // Save changes to the MainDocumentPart part.
    package.MainDocumentPart.Document.Save();

Código de ejemplo

El siguiente es el código que se puede usar para cambiar la fuente del primer párrafo de un documento de procesamiento de texto. Por ejemplo, se puede invocar el método SetRunFont en el programa para cambiar la fuente en el archivo "myPkg9.docx" mediante la siguiente llamada.

    string fileName = @"C:\Users\Public\Documents\MyPkg9.docx";
    SetRunFont(fileName);

Tras ejecutar el programa, compruebe el archivo "MyPkg9.docx" para ver la fuente modificada.

Nota:

[!NOTA] Este ejemplo de código supone que el documento de procesamiento de texto (MyPakg9.docx) contiene al menos un segmento de texto.

A continuación se incluye el código de ejemplo completo en C# y Visual Basic.

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

SetRunFont(args[0]);

// Set the font for a text run.
static void SetRunFont(string fileName)
{
    // Open a Wordprocessing document for editing.
    using (WordprocessingDocument package = WordprocessingDocument.Open(fileName, true))
    {
        // Set the font to Arial to the first Run.
        // Use an object initializer for RunProperties and rPr.
        RunProperties rPr = new RunProperties(
            new RunFonts()
            {
                Ascii = "Arial"
            });

        if (package.MainDocumentPart is null)
        {
            throw new ArgumentNullException("MainDocumentPart is null.");
        }

        Run r = package.MainDocumentPart.Document.Descendants<Run>().First();
        r.PrependChild<RunProperties>(rPr);

        // Save changes to the MainDocumentPart part.
        package.MainDocumentPart.Document.Save();
    }
}

Vea también

Inicializadores de objeto: Tipos con nombre y anónimos

Inicializadores de objeto y de colección (Guía de programación de C#)