Compartilhar via


Aceitar todas as revisões em um documento de processamento de texto

Este tópico mostra como utilizar o SDK Open XML para o Office para aceitar todas as revisões num documento de processamento de palavras programaticamente.

Estrutura de um Documento wordProcessingML

A estrutura de documentos básica de um WordProcessingML documento consiste nos document elementos e body , seguidos por um ou mais elementos de nível de bloco, como p, que representa um parágrafo. Um parágrafo contém um ou mais r elementos. Significa r execução, que é uma região de texto com um conjunto comum de propriedades, como formatação. Uma execução contém um ou mais t elementos. O t elemento contém um intervalo de texto. O seguinte exemplo de código mostra a WordprocessingML marcação de um documento que contém o texto "Texto de exemplo".

    <w:document xmlns:w="http://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>

Com o SDK Open XML, pode criar estrutura e conteúdo de documentos com classes com tipos fortes que correspondem a WordprocessingML elementos. Encontrará estas classes no espaço de nomes. A tabela seguinte lista os nomes das classes que correspondem aos documentelementos , body, p, re t .

WordprocessingML Element Abrir Classe SDK XML Descrição
<document/> Document O elemento raiz para a parte do documento principal.
<body/> Body O contentor para as estruturas de nível de bloco, como parágrafos, tabelas, anotações e outros especificados na especificação ISO/IEC 29500 .
<p/> Paragraph Um parágrafo.
<r/> Run Uma execução.
<t/> Text Um intervalo de texto.

Para obter mais informações sobre a estrutura geral das partes e elementos de um documento do WordprocessingML, veja Structure of a WordprocessingML document (Estrutura de um documento wordprocessingML).

A estrutura de documentos básica de um WordProcessingML documento consiste nos document elementos e body , seguidos por um ou mais elementos de nível de bloco, como p, que representa um parágrafo. Um parágrafo contém um ou mais r elementos. Significa r execução, que é uma região de texto com um conjunto comum de propriedades, como formatação. Uma execução contém um ou mais t elementos. O t elemento contém um intervalo de texto. O seguinte exemplo de código mostra a WordprocessingML marcação de um documento que contém o texto "Texto de exemplo".

    <w:document xmlns:w="http://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>

Com o SDK Open XML, pode criar estrutura e conteúdo de documentos com classes com tipos fortes que correspondem a WordprocessingML elementos. Encontrará estas classes no DocumentFormat.OpenXml.Wordprocessing espaço de nomes. A tabela seguinte lista os nomes das classes que correspondem aos documentelementos , body, p, re t .

WordprocessingML Element Abrir Classe SDK XML Descrição
document Document O elemento raiz para a parte do documento principal.
corpo Body O contentor para as estruturas de nível de bloco, como parágrafos, tabelas, anotações e outros especificados na especificação ISO/IEC 29500 .
p Paragraph Um parágrafo.
r Run Uma execução.
t Text Um intervalo de texto.

ParagraphPropertiesChange Element

Quando aceita uma marca de revisão, altera as propriedades de um parágrafo ao eliminar um texto existente ou ao inserir um novo texto. Nas secções seguintes, leu sobre três elementos que são utilizados no código para alterar o conteúdo do parágrafo, principalmente, <w: pPrChange> (Informações de Revisão para Propriedades de Parágrafo), <w:del> (Parágrafo Eliminado) e <w:ins> (Linha de Tabela Inserida).

As seguintes informações da especificação ISO/IEC 29500 introduzem o ParagraphPropertiesChange elemento (pPrChange).

*pPrChange (Informações de Revisão para Propriedades de Parágrafo)

Este elemento especifica os detalhes sobre uma única revisão para um conjunto de propriedades de parágrafo num documento do WordprocessingML.

Este elemento armazena esta revisão da seguinte forma:

  • O elemento subordinado deste elemento contém o conjunto completo de propriedades de parágrafo que foram aplicadas a este parágrafo antes desta revisão.

  • Os atributos deste elemento contêm informações sobre quando esta revisão ocorreu (por outras palavras, quando estas propriedades se tornaram um conjunto "antigo" de propriedades de parágrafo).

Considere um parágrafo num documento do WordprocessingML centrado e esta alteração nas propriedades do parágrafo é controlada como uma revisão. Esta revisão seria especificada com a seguinte marcação wordprocessingML.

    <w:pPr>
      <w:jc w:val="center"/>
      <w:pPrChange w:id="0" w:date="01-01-2006T12:00:00" w:author="Samantha Smith">
        <w:pPr/>
      </w:pPrChange>
    </w:pPr>

O elemento especifica que houve uma revisão das propriedades de parágrafo em 01-01-2006 por Samantha Smith e que o conjunto anterior de propriedades de parágrafo no parágrafo era o conjunto nulo (por outras palavras, não existem propriedades de parágrafo explicitamente presentes no elemento). pPr pPrChange

© ISO/IEC 29500: 2016

Elemento Eliminado

As seguintes informações da especificação ISO/IEC 29500 introduzem o elemento Eliminado (del).

del (Parágrafo Eliminado)

Este elemento especifica que a marca de parágrafo que delimita o fim de um parágrafo num documento wordprocessingML deve ser tratada como eliminada (ou seja, os conteúdos deste parágrafo deixarão de ser delimitados por esta marca de parágrafo e combinados com o parágrafo seguinte, mas esses conteúdos não serão marcados automaticamente como eliminados) como parte de uma revisão controlada.

Considere um documento composto por dois parágrafos (com cada parágrafo delimitado por um pilcrow ¶):

Dois parágrafos, cada um delimitado por um pilcrow Se o caráter físico que delimita o fim do primeiro parágrafo for eliminado e esta alteração for controlada como uma revisão, resultará o seguinte:

Dois parágrafos delimitados por um único pilcrow Esta revisão é representada com o seguinte WordprocessingML:

    <w:p>
      <w:pPr>
        <w:rPr>
          <w:del w:id="0" … />
        </w:rPr>
      </w:pPr>
      <w:r>
        <w:t>This is paragraph one.</w:t>
      </w:r>
    </w:p>
    <w:p>
      <w:r>
        <w:t>This is paragraph two.</w:t>
      </w:r>
    </w:p>

O del elemento nas propriedades de execução da primeira marca de parágrafo especifica que esta marca de parágrafo foi eliminada e esta eliminação foi monitorizada como uma revisão.

© ISO/IEC 29500: 2016

O Elemento Inserido

As seguintes informações da especificação ISO/IEC 29500 introduzem o elemento Inserido (ins).

ins (Linha de Tabela Inserida)

Este elemento especifica que a linha da tabela principal deve ser tratada como uma linha inserida cuja inserção tenha sido controlada como uma revisão. Esta definição não implicará qualquer estado de revisão sobre as células da tabela nesta linha ou os respetivos conteúdos (que têm de ser marcadas de forma independente) e só afetará a linha da tabela.

Considere uma tabela de duas linhas por duas colunas na qual a segunda linha foi marcada como inserida com uma revisão. Este requisito seria especificado com o seguinte WordprocessingML:

    <w:tbl>
      <w:tr>
        <w:tc>
          <w:p/>
        </w:tc>
        <w:tc>
          <w:p/>
        </w:tc>
      </w:tr>
      <w:tr>
        <w:trPr>
          <w:ins w:id="0" … />
        </w:trPr>
        <w:tc>
          <w:p/>
        </w:tc>
        <w:tc>
          <w:p/>
        </w:tc>
      </w:tr>
    </w:tbl>

O ins elemento nas propriedades da linha da tabela para a segunda linha da tabela especifica que esta linha foi inserida e esta inserção foi monitorizada como uma revisão.

© ISO/IEC 29500: 2016

Código de exemplo

O exemplo de código seguinte mostra como aceitar todas as revisões num documento de processamento de palavras.

Depois de executar o programa, abra o ficheiro de processamento de palavras para se certificar de que todas as marcas de revisão foram aceites.

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

AcceptAllRevisions(args[0], args[1]);

static void AcceptAllRevisions(string fileName, string authorName)
{
    using (WordprocessingDocument wdDoc = WordprocessingDocument.Open(fileName, true))
    {
        if (wdDoc.MainDocumentPart is null || wdDoc.MainDocumentPart.Document.Body is null)
        {
            throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
        }

        Body body = wdDoc.MainDocumentPart.Document.Body;

        // Handle the formatting changes.
        List<OpenXmlElement> changes = body.Descendants<ParagraphPropertiesChange>()
            .Where(c => c.Author is not null && c.Author.Value == authorName).Cast<OpenXmlElement>().ToList();

        foreach (OpenXmlElement change in changes)
        {
            change.Remove();
        }

        // Handle the deletions.
        List<OpenXmlElement> deletions = body
            .Descendants<Deleted>()
            .Where(c => c.Author is not null && c.Author.Value == authorName)
            .Cast<OpenXmlElement>().ToList();

        deletions.AddRange(body.Descendants<DeletedRun>()
            .Where(c => c.Author is not null && c.Author.Value == authorName).Cast<OpenXmlElement>().ToList());

        deletions.AddRange(body.Descendants<DeletedMathControl>()
            .Where(c => c.Author is not null && c.Author.Value == authorName).Cast<OpenXmlElement>().ToList());

        foreach (OpenXmlElement deletion in deletions)
        {
            deletion.Remove();
        }

        // Handle the insertions.
        List<OpenXmlElement> insertions =
            body.Descendants<Inserted>()
            .Where(c => c.Author is not null && c.Author.Value == authorName).Cast<OpenXmlElement>().ToList();

        insertions.AddRange(body.Descendants<InsertedRun>()
            .Where(c => c.Author is not null && c.Author.Value == authorName).Cast<OpenXmlElement>().ToList());

        insertions.AddRange(body.Descendants<InsertedMathControl>()
            .Where(c => c.Author is not null && c.Author.Value == authorName).Cast<OpenXmlElement>().ToList());

        foreach (OpenXmlElement insertion in insertions)
        {
            // Found new content.
            // Promote them to the same level as node, and then delete the node.
            foreach (var run in insertion.Elements<Run>())
            {
                if (run == insertion.FirstChild)
                {
                    insertion.InsertAfterSelf(new Run(run.OuterXml));
                }
                else
                {
                    OpenXmlElement nextSibling = insertion.NextSibling()!;
                    nextSibling.InsertAfterSelf(new Run(run.OuterXml));
                }
            }

            insertion.RemoveAttribute("rsidR", "https://schemas.openxmlformats.org/wordprocessingml/2006/main");
            insertion.RemoveAttribute("rsidRPr", "https://schemas.openxmlformats.org/wordprocessingml/2006/main");
            insertion.Remove();
        }
    }
}