Adicionar ou remover cabeçalho e rodapé em documentos do Word usando C++

Cabeçalhos e rodapés em documentos do Word são usados para formatar e mostrar informações importantes, como tópico, capítulo, número de página, Copywrite, etc. Ao trabalhar com documentos do Word programaticamente, pode ser necessário adicionar ou remover cabeçalhos e rodapés. Para isso, este artigo ensinará como adicionar e remover cabeçalhos e rodapés em documentos do Word usando C++.

Para adicionar cabeçalhos e rodapés em documentos do Word, usaremos a API Aspose.Words for C++. É uma API C++ nativa que oferece suporte à criação, leitura e modificação de documentos do Word sem exigir a instalação do Microsoft Word. Você pode instalar a API por meio do NuGet ou baixá-la diretamente da seção Downloads.

PM> Install-Package Aspose.Words.Cpp

Os cabeçalhos e rodapés em um documento do Word são divididos em três seções, a página de título, páginas pares e páginas ímpares. Você pode adicionar diferentes cabeçalhos e rodapés para essas seções. Além disso, você também pode adicionar elementos como imagens e tabelas em cabeçalhos e rodapés.

Neste exemplo, criaremos um novo documento do Word e adicionaremos um cabeçalho diferente para a página de título. Vamos adicionar um cabeçalho com uma imagem e um rodapé com uma tabela nas páginas subsequentes. A seguir estão as etapas para adicionar cabeçalhos e rodapés em documentos do Word.

O código de exemplo a seguir demonstra como adicionar cabeçalhos e rodapés em documentos do Word usando C++.

void CopyHeadersFootersFromPreviousSection(const System::SharedPtr<Section>& section)
{
	System::SharedPtr<Section> previousSection = System::DynamicCast<Section>(section->get_PreviousSibling());

	if (previousSection == nullptr)
	{
		return;
	}

	section->get_HeadersFooters()->Clear();

	for (System::SharedPtr<Node> headerFooterNode : System::IterateOver(previousSection->get_HeadersFooters()))
	{
		section->get_HeadersFooters()->Add(headerFooterNode->Clone(true));
	}
}

int main()
{
	// Caminhos de diretório de origem e saída.
	System::String inputDataDir = u"SourceDirectory\\";
	System::String outputDataDir = u"OutputDirectory\\";

	System::SharedPtr<Document> doc = System::MakeObject<Document>();
	System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);

	System::SharedPtr<Section> currentSection = builder->get_CurrentSection();
	System::SharedPtr<PageSetup> pageSetup = currentSection->get_PageSetup();

	// Especifique se queremos que os cabeçalhos/rodapés da primeira página sejam diferentes das outras páginas.
	// Você também pode usar a propriedade PageSetup.OddAndEvenPagesHeaderFooter para especificar
	// Cabeçalhos/rodapés diferentes para páginas pares e ímpares.
	pageSetup->set_DifferentFirstPageHeaderFooter(true);

	// --- Criar cabeçalho para a primeira página. ---
	pageSetup->set_HeaderDistance(20);
	builder->MoveToHeaderFooter(HeaderFooterType::HeaderFirst);
	builder->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Center);

	// Defina as propriedades da fonte para o texto do cabeçalho.
	builder->get_Font()->set_Name(u"Arial");
	builder->get_Font()->set_Bold(true);
	builder->get_Font()->set_Size(14);

	// Especifique o título do cabeçalho para a primeira página.
	builder->Write(u"Aspose.Words Header/Footer Creation Primer - Title Page.");

	// --- Criar cabeçalho para outras páginas além da primeira página. ---
	pageSetup->set_HeaderDistance(20);
	builder->MoveToHeaderFooter(HeaderFooterType::HeaderPrimary);

	// Insira a imagem absolutamente posicionada no canto superior/esquerdo do cabeçalho.
	// A distância das bordas superior/esquerda da página é definida como 10 pontos.
	System::String imageFileName = inputDataDir + u"Desert.jpg";
	builder->InsertImage(imageFileName, RelativeHorizontalPosition::Page, 10, RelativeVerticalPosition::Page, 10, 50, 50, WrapType::Through);

	builder->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Right);

	// Especifique o título do cabeçalho para outras páginas.
	builder->Write(u"Aspose.Words Header/Footer Creation Primer.");

	// --- Criar rodapé para outras páginas além da primeira. ---
	builder->MoveToHeaderFooter(HeaderFooterType::FooterPrimary);

	// Usamos tabela com duas células para fazer uma parte do texto na linha (com numeração de página)
	// A ser alinhado à esquerda, e a outra parte do texto (com direitos autorais) a ser alinhado à direita.
	builder->StartTable();

	// Limpar bordas da tabela.
	builder->get_CellFormat()->ClearFormatting();

	builder->InsertCell();

	// Defina a primeira célula para 1/3 da largura da página.
	builder->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 / 3));

	// Insira o texto de numeração de página aqui.
	// Ele usa os campos PAGE e NUMPAGES para calcular automaticamente o número da página atual e o número total de páginas.
	builder->Write(u"Page ");
	builder->InsertField(u"PAGE", u"");
	builder->Write(u" of ");
	builder->InsertField(u"NUMPAGES", u"");

	// Alinhe este texto à esquerda.
	builder->get_CurrentParagraph()->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Left);

	builder->InsertCell();

	// Defina a segunda célula para 2/3 da largura da página.
	builder->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 * 2 / 3));

	builder->Write(u"(C) 2001 Aspose Pty Ltd. All rights reserved.");

	// Alinhe este texto à direita.
	builder->get_CurrentParagraph()->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Right);

	builder->EndRow();
	builder->EndTable();

	builder->MoveToDocumentEnd();

	// Adicione uma quebra de página para criar uma segunda página na qual os cabeçalhos/rodapés primários serão vistos.
	builder->InsertBreak(BreakType::PageBreak);

	// Adicione uma quebra de seção para criar uma terceira página com orientação de página diferente.
	builder->InsertBreak(BreakType::SectionBreakNewPage);

	// Obtenha a nova seção e sua configuração de página.
	currentSection = builder->get_CurrentSection();
	pageSetup = currentSection->get_PageSetup();

	// Defina a orientação da página da nova seção para paisagem.
	pageSetup->set_Orientation(Orientation::Landscape);

	// Esta seção não precisa de cabeçalho/rodapé de primeira página diferente.
	// Precisamos apenas de uma página de título no documento. O cabeçalho/rodapé desta página
	// já foi definido na seção anterior
	pageSetup->set_DifferentFirstPageHeaderFooter(false);

	// Esta seção exibe cabeçalhos/rodapés da seção anterior por padrão.
	// Chame currentSection.HeadersFooters.LinkToPrevious(false) para cancelar esse comportamento.
	// A largura da página é diferente para a nova seção e, portanto, precisamos definir 
	// larguras de célula diferentes para uma tabela de rodapé.
	currentSection->get_HeadersFooters()->LinkToPrevious(false);

	// Se quisermos usar o conjunto de cabeçalho/rodapé já existente para esta seção 
	// mas com algumas pequenas modificações, pode ser conveniente copiar cabeçalhos/rodapés
	// da seção anterior e aplicar as modificações necessárias onde quisermos.
	CopyHeadersFootersFromPreviousSection(currentSection);

	// Encontre o rodapé que queremos alterar.
	System::SharedPtr<HeaderFooter> primaryFooter = currentSection->get_HeadersFooters()->idx_get(HeaderFooterType::FooterPrimary);

	System::SharedPtr<Row> row = primaryFooter->get_Tables()->idx_get(0)->get_FirstRow();
	row->get_FirstCell()->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 / 3));
	row->get_LastCell()->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 * 2 / 3));

	System::String outputPath = outputDataDir + u"CreateHeaderFooter.docx";

	// Salve o documento resultante.
	doc->Save(outputPath);
}
Visualização de impressão da saída gerada pelo código de amostra

Visualização de impressão da saída gerada pelo código de amostra

Na seção anterior, você aprendeu como adicionar cabeçalhos e rodapés em documentos do Word. Semelhante à adição, você pode remover os cabeçalhos e rodapés do título, páginas pares e ímpares de acordo com suas necessidades. A seguir estão as etapas para excluir todos os cabeçalhos e rodapés em um documento do Word.

O código de exemplo a seguir mostra como excluir todos os cabeçalhos e rodapés em um documento do Word usando C++.

// Caminhos de diretório de origem e saída.
System::String inputDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";

System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleHeaderFooter.docx");

for (System::SharedPtr<Section> section : System::IterateOver<System::SharedPtr<Section>>(doc))
{
	// Até três cabeçalhos e rodapés diferentes são possíveis em uma seção (para páginas iniciais, pares e ímpares).
	// Verificamos e excluímos todos eles.
	System::SharedPtr<HeaderFooter> header;
	System::SharedPtr<HeaderFooter> footer;

	header = section->get_HeadersFooters()->idx_get(HeaderFooterType::HeaderFirst);
	footer = section->get_HeadersFooters()->idx_get(HeaderFooterType::FooterFirst);
	if (header != nullptr)
	{
		header->Remove();
	}
	if (footer != nullptr)
	{
		footer->Remove();
	}

	// Cabeçalho e rodapé primários são usados para páginas ímpares.
	header = section->get_HeadersFooters()->idx_get(HeaderFooterType::HeaderPrimary);
	footer = section->get_HeadersFooters()->idx_get(HeaderFooterType::FooterPrimary);
	if (header != nullptr)
	{
		header->Remove();
	}
	if (footer != nullptr)
	{
		footer->Remove();
	}

	header = section->get_HeadersFooters()->idx_get(HeaderFooterType::HeaderEven);
	footer = section->get_HeadersFooters()->idx_get(HeaderFooterType::FooterEven);
	if (header != nullptr)
	{
		header->Remove();
	}
	if (footer != nullptr)
	{
		footer->Remove();
	}
}

// Caminho do arquivo de saída
System::String outputPath = outputDataDir + u"RemoveFooters.docx";

// Salve o documento.
doc->Save(outputPath);

Obtenha uma licença gratuita

Você pode experimentar a API sem limitações de avaliação solicitando uma licença temporária gratuita.

Conclusão

Trabalhar com cabeçalhos e rodapés em documentos do Word é um caso de uso comum e frequente. Neste artigo, você aprendeu a trabalhar com cabeçalhos e rodapés em documentos do Word usando C++. Especificamente, você aprendeu como adicionar e remover cabeçalhos e rodapés em documentos do Word usando Aspose.Words for C++ API. A API fornece vários recursos adicionais para trabalhar com documentos do Word que você pode explorar em detalhes visitando a documentação oficial. Em caso de dúvidas, sinta-se à vontade para entrar em contato conosco em nosso fórum de suporte gratuito.

Veja também