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++.
- API C++ para adicionar e remover cabeçalho e rodapé em documentos do Word
- Adicionar cabeçalho e rodapé em documentos do Word usando C++
- Excluir cabeçalho e rodapé em um documento do Word usando C++
API C++ para adicionar e remover cabeçalho e rodapé em documentos do Word
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
Adicionar cabeçalho e rodapé em documentos do Word usando C++
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.
- Crie uma instância da classe Document para representar o documento do Word.
- Crie uma instância da classe DocumentBuilder usando o objeto Document criado anteriormente.
- Especifique que você deseja um cabeçalho e rodapé diferentes para a página de título usando o método PageSetup->setDifferentFirstPageHeaderFooter(bool value).
- Defina as propriedades da fonte para o texto do cabeçalho.
- Crie o cabeçalho e o rodapé para as páginas subsequentes.
- Adicione a imagem no cabeçalho usando o DocumentBuilder->InsertImage(System::SharedPtrSystem::Drawing::Image image, Aspose::Words::Desenho::RelativeHorizontalPosition horzPos, dupla esquerda, Aspose::Words::Desenho::RelativeVerticalPosition vertPos, double top, double width, double height, Aspose::Words::Drawing::WrapType wrapType) método.
- Adicione a tabela no rodapé.
- Salve o documento do Word usando o método Document->Save(System::String fileName).
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);
}
Excluir cabeçalho e rodapé em um documento do Word usando C++
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.
- Carregue o documento do Word usando a classe Document.
- Crie duas instâncias da classe HeaderFooter para representar os cabeçalhos e os rodapés.
- Recupere os cabeçalhos e rodapés para o título, páginas pares e ímpares usando o método Section->getHeadersFooters()->idxget(Aspose::Words::HeaderFooterType headerFooterType).
- Remova os cabeçalhos e rodapés usando o método HeaderFooter->Remove().
- Salve o documento do Word usando o método Document->Save(System::String fileName).
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.