Agregar o quitar encabezado y pie de página en documentos de Word usando C++

Los encabezados y pies de página en los documentos de Word se utilizan para formatear y mostrar información importante, como el tema, el capítulo, el número de página, la redacción, etc. Mientras trabaja con documentos de Word mediante programación, es posible que deba agregar o eliminar encabezados y pies de página. Con ese fin, este artículo le enseñará cómo agregar y eliminar encabezados y pies de página en documentos de Word usando C++.

Para agregar encabezados y pies de página en documentos de Word, usaremos la API Aspose.Words for C++. Es una API nativa de C++ que admite la creación, lectura y modificación de documentos de Word sin necesidad de instalar Microsoft Word. Puede instalar la API a través de NuGet o descargarla directamente desde la sección Descargas.

PM> Install-Package Aspose.Words.Cpp

Los encabezados y pies de página en un documento de Word se dividen en tres secciones, la página de título, las páginas pares y las páginas impares. Puede agregar diferentes encabezados y pies de página para estas secciones. Además, también puede agregar elementos como imágenes y tablas en encabezados y pies de página.

En este ejemplo, crearemos un nuevo documento de Word y agregaremos un encabezado diferente para la página de título. Agregaremos un encabezado con una imagen y un pie de página con una tabla en las páginas siguientes. Los siguientes son los pasos para agregar encabezados y pies de página en documentos de Word.

El siguiente código de ejemplo demuestra cómo agregar encabezados y pies de página en documentos de 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()
{
	// Rutas de directorio de origen y salida.
	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();

	// Especificar si queremos que los encabezados/pies de página de la primera página sean diferentes de otras páginas.
	// También puede usar la propiedad PageSetup.OddAndEvenPagesHeaderFooter para especificar
	// Diferentes encabezados/pies de página para páginas pares e impares.
	pageSetup->set_DifferentFirstPageHeaderFooter(true);

	// --- Crear encabezado para la primera página. ---
	pageSetup->set_HeaderDistance(20);
	builder->MoveToHeaderFooter(HeaderFooterType::HeaderFirst);
	builder->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Center);

	// Establecer propiedades de fuente para el texto del encabezado.
	builder->get_Font()->set_Name(u"Arial");
	builder->get_Font()->set_Bold(true);
	builder->get_Font()->set_Size(14);

	// Especifique el título del encabezado para la primera página.
	builder->Write(u"Aspose.Words Header/Footer Creation Primer - Title Page.");

	// --- Crear encabezado para páginas que no sean la primera página. ---
	pageSetup->set_HeaderDistance(20);
	builder->MoveToHeaderFooter(HeaderFooterType::HeaderPrimary);

	// Inserte una imagen absolutamente posicionada en la esquina superior izquierda del encabezado.
	// La distancia desde los bordes superior/izquierdo de la página se establece en 10 puntos.
	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 el título del encabezado para otras páginas.
	builder->Write(u"Aspose.Words Header/Footer Creation Primer.");

	// --- Crear pie de página para páginas que no sean la primera página. ---
	builder->MoveToHeaderFooter(HeaderFooterType::FooterPrimary);

	// Usamos tabla con dos celdas para hacer una parte del texto en la línea (con numeración de páginas)
	// Para alinear a la izquierda, y la otra parte del texto (con derechos de autor) para alinear a la derecha.
	builder->StartTable();

	// Limpiar los bordes de la tabla.
	builder->get_CellFormat()->ClearFormatting();

	builder->InsertCell();

	// Establezca la primera celda en 1/3 del ancho de la página.
	builder->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 / 3));

	// Inserte aquí el texto de numeración de páginas.
	// Utiliza los campos PÁGINA y NÚMERO para calcular automáticamente el número de página actual y el número total de páginas.
	builder->Write(u"Page ");
	builder->InsertField(u"PAGE", u"");
	builder->Write(u" of ");
	builder->InsertField(u"NUMPAGES", u"");

	// Alinea este texto a la izquierda.
	builder->get_CurrentParagraph()->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Left);

	builder->InsertCell();

	// Establezca la segunda celda en 2/3 del ancho de la página.
	builder->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 * 2 / 3));

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

	// Alinea este texto a la derecha.
	builder->get_CurrentParagraph()->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Right);

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

	builder->MoveToDocumentEnd();

	// Agregue un salto de página para crear una segunda página en la que se verán los encabezados y pies de página principales.
	builder->InsertBreak(BreakType::PageBreak);

	// Agregue un salto de sección para crear una tercera página con una orientación de página diferente.
	builder->InsertBreak(BreakType::SectionBreakNewPage);

	// Obtenga la nueva sección y su configuración de página.
	currentSection = builder->get_CurrentSection();
	pageSetup = currentSection->get_PageSetup();

	// Establezca la orientación de la página de la nueva sección en horizontal.
	pageSetup->set_Orientation(Orientation::Landscape);

	// Esta sección no necesita un encabezado/pie de página diferente en la primera página.
	// Solo necesitamos una página de título en el documento. El encabezado/pie de página de esta página
	// ya se ha definido en el apartado anterior
	pageSetup->set_DifferentFirstPageHeaderFooter(false);

	// Esta sección muestra encabezados/pies de página de la sección anterior de forma predeterminada.
	// Llame a currentSection.HeadersFooters.LinkToPrevious(false) para cancelar este comportamiento.
	// El ancho de página es diferente para la nueva sección y, por lo tanto, debemos establecer 
	// diferentes anchos de celda para una tabla de pie de página.
	currentSection->get_HeadersFooters()->LinkToPrevious(false);

	// Si queremos usar el conjunto de encabezado/pie de página ya existente para esta sección 
	// pero con algunas modificaciones menores, puede ser conveniente copiar encabezados/pies de página
	// del apartado anterior y aplicar las modificaciones necesarias donde queramos.
	CopyHeadersFootersFromPreviousSection(currentSection);

	// Busque el pie de página que queremos cambiar.
	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";

	// Guarde el documento resultante.
	doc->Save(outputPath);
}
Imprimir vista previa de la salida generada por el código de muestra

Imprimir vista previa de la salida generada por el código de muestra

En la sección anterior, aprendió cómo agregar encabezados y pies de página en documentos de Word. Similar a agregar, puede eliminar los encabezados y pies de página del título, páginas pares e impares según sus necesidades. Los siguientes son los pasos para eliminar todos los encabezados y pies de página en un documento de Word.

El siguiente código de ejemplo muestra cómo eliminar todos los encabezados y pies de página en un documento de Word usando C++.

// Rutas de directorio de origen y salida.
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))
{
	// Son posibles hasta tres encabezados y pies de página diferentes en una sección (para las primeras páginas, pares e impares).
	// Los revisamos y borramos todos.
	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();
	}

	// El encabezado y pie de página principales se utilizan para las páginas impares.
	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();
	}
}

// Ruta del archivo de salida
System::String outputPath = outputDataDir + u"RemoveFooters.docx";

// Guarde el documento.
doc->Save(outputPath);

Obtenga una licencia gratis

Puede probar la API sin limitaciones de evaluación solicitando una licencia temporal gratuita.

Conclusión

Trabajar con encabezados y pies de página en documentos de Word es un caso de uso común y frecuente. En este artículo, ha aprendido a trabajar con encabezados y pies de página en documentos de Word usando C++. Específicamente, aprendió cómo agregar y eliminar encabezados y pies de página en documentos de Word usando Aspose.Words for C++. La API proporciona un montón de funciones adicionales para trabajar con documentos de Word que puede explorar en detalle visitando la documentación oficial. Si tiene alguna pregunta, no dude en comunicarse con nosotros en nuestro foro de soporte gratuito.

Ver también