LayoutEnumerator

LayoutEnumerator class

Enumera le entità di layout di pagina di un documento. Puoi utilizzare questa classe per esplorare il modello di layout di pagina. Le proprietà disponibili sono tipo, geometria, testo e indice di pagina in cui viene visualizzata l’entità, nonché struttura e relazioni generali. Utilizza una combinazione diGetEntity ECurrent passare all’entità che corrisponde a un nodo del documento.

Per saperne di più, visita ilConversione nel formato a pagina fissa articolo di documentazione.

public class LayoutEnumerator

Costruttori

NomeDescrizione
LayoutEnumerator(Document)Inizializza la nuova istanza di questa classe.

Proprietà

NomeDescrizione
Current { get; set; }Ottiene o imposta la posizione corrente nel modello di layout della pagina. Questa proprietà restituisce un oggetto opaco che corrisponde all’entità di layout corrente.
Document { get; }Ottiene il documento enumerato da questa istanza.
Item { get; }Ottiene una proprietà denominata dell’entità.
Kind { get; }Ottiene il tipo dell’entità corrente. Può essere una stringa vuota ma mainullo .
PageIndex { get; }Ottiene l’indice in base 1 di una pagina che contiene l’entità corrente.
Rectangle { get; }Restituisce il rettangolo di delimitazione dell’entità corrente rispetto all’angolo superiore sinistro della pagina (in punti).
Text { get; }Ottiene il testo dell’entità span corrente. Lancia per altri tipi di entità.
Type { get; }Ottiene il tipo dell’entità corrente.

Metodi

NomeDescrizione
MoveFirstChild()Passa alla prima entità figlio.
MoveLastChild()Passa all’ultima entità figlio.
MoveNext()Passa all’entità di pari livello successiva in ordine visivo. Quando si ripetono le righe di un paragrafo interrotte su più pagine, questo metodo non si sposterà alla pagina successiva ma piuttosto si sposterà all’entità successiva sulla stessa pagina.
MoveNextLogical()Passa all’entità di pari livello successiva in ordine logico. Quando si ripetono le righe di un paragrafo interrotte su più pagine, questo metodo si sposterà alla riga successiva anche se risiede su un’altra pagina.
MoveParent()Passa all’entità principale.
MoveParent(LayoutEntityType)Passa all’entità principale del tipo specificato.
MovePrevious()Passa all’entità gemella precedente.
MovePreviousLogical()Passa all’entità gemella precedente in ordine logico. Quando si ripetono le righe di un paragrafo spezzate su più pagine, questo metodo si sposterà alla riga precedente anche se risiede su un’altra pagina.
Reset()Sposta l’enumeratore alla prima pagina del documento.

Esempi

Mostra le modalità per attraversare le entità di layout di un documento.

public void LayoutEnumerator()
{
    // Apre un documento che contiene una varietà di entità di layout.
    // Le entità di layout sono pagine, celle, righe, linee e altri oggetti inclusi nell'enumerazione LayoutEntityType.
    // Ogni entità di layout ha uno spazio rettangolare che occupa nel corpo del documento.
    Document doc = new Document(MyDir + "Layout entities.docx");

    // Crea un enumeratore che possa attraversare queste entità come un albero.
    LayoutEnumerator layoutEnumerator = new LayoutEnumerator(doc);

    Assert.AreEqual(doc, layoutEnumerator.Document);

    layoutEnumerator.MoveParent(LayoutEntityType.Page);

    Assert.AreEqual(LayoutEntityType.Page, layoutEnumerator.Type);
    Assert.Throws<InvalidOperationException>(() => Console.WriteLine(layoutEnumerator.Text));

    // Possiamo chiamare questo metodo per assicurarci che l'enumeratore si trovi nella prima entità di layout.
    layoutEnumerator.Reset();

    // Esistono due ordini che determinano il modo in cui l'enumeratore di layout continua ad attraversare le entità di layout
    // quando incontra entità che si estendono su più pagine.
    // 1 - In ordine visivo:
    // Quando ci si sposta tra i figli di un'entità che si estendono su più pagine,
    // il layout della pagina ha la precedenza e ci spostiamo su altri elementi secondari in questa pagina ed evitiamo quelli nella successiva.
    Console.WriteLine("Traversing from first to last, elements between pages separated:");
    TraverseLayoutForward(layoutEnumerator, 1);

    // Il nostro enumeratore è ora alla fine della raccolta. Possiamo attraversare le entità del layout all'indietro per tornare all'inizio.
    Console.WriteLine("Traversing from last to first, elements between pages separated:");
    TraverseLayoutBackward(layoutEnumerator, 1);

    // 2 - In ordine logico:
    // Quando ci si sposta tra i figli di un'entità che si estendono su più pagine,
    // l'enumeratore si sposterà tra le pagine per attraversare tutte le entità figlie.
    Console.WriteLine("Traversing from first to last, elements between pages mixed:");
    TraverseLayoutForwardLogical(layoutEnumerator, 1);

    Console.WriteLine("Traversing from last to first, elements between pages mixed:");
    TraverseLayoutBackwardLogical(layoutEnumerator, 1);
}

/// <summary>
/// Enumera la raccolta di entità di layout di layoutEnumerator dalla parte anteriore a quella posteriore,
/// in modo approfondito e nell'ordine "visivo".
/// </summary>
private static void TraverseLayoutForward(LayoutEnumerator layoutEnumerator, int depth)
{
    do
    {
        PrintCurrentEntity(layoutEnumerator, depth);

        if (layoutEnumerator.MoveFirstChild())
        {
            TraverseLayoutForward(layoutEnumerator, depth + 1);
            layoutEnumerator.MoveParent();
        }
    } while (layoutEnumerator.MoveNext());
}

/// <summary>
/// Enumera la raccolta di entità di layout di layoutEnumerator dall'inizio alla fine,
/// in modo approfondito e nell'ordine "visivo".
/// </summary>
private static void TraverseLayoutBackward(LayoutEnumerator layoutEnumerator, int depth)
{
    do
    {
        PrintCurrentEntity(layoutEnumerator, depth);

        if (layoutEnumerator.MoveLastChild())
        {
            TraverseLayoutBackward(layoutEnumerator, depth + 1);
            layoutEnumerator.MoveParent();
        }
    } while (layoutEnumerator.MovePrevious());
}

/// <summary>
/// Enumera la raccolta di entità di layout di layoutEnumerator dalla parte anteriore a quella posteriore,
/// in modo approfondito e nell'ordine "logico".
/// </summary>
private static void TraverseLayoutForwardLogical(LayoutEnumerator layoutEnumerator, int depth)
{
    do
    {
        PrintCurrentEntity(layoutEnumerator, depth);

        if (layoutEnumerator.MoveFirstChild())
        {
            TraverseLayoutForwardLogical(layoutEnumerator, depth + 1);
            layoutEnumerator.MoveParent();
        }
    } while (layoutEnumerator.MoveNextLogical());
}

/// <summary>
/// Enumera la raccolta di entità di layout di layoutEnumerator dall'inizio alla fine,
/// in modo approfondito e nell'ordine "logico".
/// </summary>
private static void TraverseLayoutBackwardLogical(LayoutEnumerator layoutEnumerator, int depth)
{
    do
    {
        PrintCurrentEntity(layoutEnumerator, depth);

        if (layoutEnumerator.MoveLastChild())
        {
            TraverseLayoutBackwardLogical(layoutEnumerator, depth + 1);
            layoutEnumerator.MoveParent();
        }
    } while (layoutEnumerator.MovePreviousLogical());
}

/// <summary>
/// Stampa le informazioni sull'entità corrente di layoutEnumerator sulla console, facendo rientrare il testo con caratteri di tabulazione
/// in base alla sua profondità rispetto al nodo radice che abbiamo fornito nell'istanza del costruttore LayoutEnumerator.
/// Il rettangolo che elaboriamo alla fine rappresenta l'area e la posizione che l'entità occupa nel documento.
/// </summary>
private static void PrintCurrentEntity(LayoutEnumerator layoutEnumerator, int indent)
{
    string tabs = new string('\t', indent);

    Console.WriteLine(layoutEnumerator.Kind == string.Empty
        ? $"{tabs}-> Entity type: {layoutEnumerator.Type}"
        : $"{tabs}-> Entity type & kind: {layoutEnumerator.Type}, {layoutEnumerator.Kind}");

    // Solo gli span possono contenere testo.
    if (layoutEnumerator.Type == LayoutEntityType.Span)
        Console.WriteLine($"{tabs}   Span contents: \"{layoutEnumerator.Text}\"");

    RectangleF leRect = layoutEnumerator.Rectangle;
    Console.WriteLine($"{tabs}   Rectangle dimensions {leRect.Width}x{leRect.Height}, X={leRect.X} Y={leRect.Y}");
    Console.WriteLine($"{tabs}   Page {layoutEnumerator.PageIndex}");
}

Guarda anche