La tabla de contenido (TOC) es una parte importante de un documento de Word. Proporciona una descripción general del contenido del documento y le permite navegar rápidamente a la sección deseada. Es posible que se encuentre en escenarios en los que necesite agregar, extraer, actualizar o eliminar la tabla de contenido de los documentos de Word mediante programación. Con ese fin, este artículo le enseñará cómo trabajar con la tabla de contenido en archivos de Word usando C++.

API de C++ para trabajar con tablas de contenido en documentos de Word

Aspose.Words for C++ es una biblioteca nativa de C++ que le permite crear, leer, modificar y convertir documentos de Microsoft Word. Además, también admite trabajar con la tabla de contenido en archivos de Word. Puede instalar la API a través de NuGet o descargarla directamente desde la sección Descargas.

PM> Install-Package Aspose.Words.Cpp

Agregar la tabla de contenido en un documento de Word

Los siguientes son los pasos para agregar una tabla de contenido en un documento de Word.

El siguiente código de ejemplo muestra cómo agregar una tabla de contenido en un documento de Word mediante C++.

// Rutas de directorio de origen y salida.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";

// Cargue el archivo de Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");

// Crear una instancia de la clase DocumentBuilder
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);

// Inserta una tabla de contenido al principio del documento.
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");

// La tabla de contenido recién insertada estará inicialmente vacía.
// Debe completarse actualizando los campos en el documento.
doc->UpdateFields();

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

// Guarde el archivo de Word
doc->Save(outputPath);
Archivo de Word de salida que contiene la tabla de contenido

Archivo de Word de salida que contiene la tabla de contenido

Extraiga la tabla de contenido de un documento de Word

Los siguientes son los pasos para extraer la tabla de contenido de un documento de Word.

El siguiente código de ejemplo muestra cómo extraer la tabla de contenido de un documento de Word mediante C++.

// directorio de origen
System::String inputDataDir = u"SourceDirectory\\";

// Cargue el archivo de Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");

// Bucle a través de los campos
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
	// Obtener campos FieldHyperlink
	if (field->get_Type() == FieldType::FieldHyperlink)
	{
		System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);

		// Comprobar si el campo pertenece a TOC
		if (hyperlink->get_SubAddress() != nullptr && hyperlink->get_SubAddress().StartsWith(u"_Toc"))
		{
			System::SharedPtr<Paragraph> tocItem = System::DynamicCast<Paragraph>(field->get_FieldStart()->GetAncestor(NodeType::Paragraph));
			std::cout << System::StaticCast<Node>(tocItem)->ToString(SaveFormat::Text).Trim().ToUtf8String() << std::endl;
			std::cout << "------------------" << std::endl;
			if (tocItem != nullptr)
			{
				System::SharedPtr<Bookmark> bm = doc->get_Range()->get_Bookmarks()->idx_get(hyperlink->get_SubAddress());

				// Obtener la ubicación a la que apunta este elemento TOC
				System::SharedPtr<Paragraph> pointer = System::DynamicCast<Paragraph>(bm->get_BookmarkStart()->GetAncestor(NodeType::Paragraph));
				std::cout << System::StaticCast<Node>(pointer)->ToString(SaveFormat::Text).ToUtf8String() << std::endl;
			}
		}
	}
}

Actualizar la tabla de contenido en un documento de Word

Si el contenido del documento se actualizó y necesita reflejar esos cambios en la tabla de contenido, simplemente necesita cargar el archivo de Word y llamar al método Document->UpdateFields(). Este método actualizará la tabla de contenido de acuerdo con el contenido modificado. Después de esto, guarde el documento de Word actualizado.

Eliminar la tabla de contenido de un documento de Word

Los siguientes son los pasos para eliminar la tabla de contenido de un documento de Word.

El siguiente código de ejemplo muestra cómo quitar la tabla de contenido de un documento de Word mediante C++.

void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
	// Almacene los nodos FieldStart de los campos TOC en el documento para un acceso rápido.
	std::vector<System::SharedPtr<FieldStart>> fieldStarts;
	// Esta es una lista para almacenar los nodos que se encuentran dentro del TOC especificado. serán eliminados
	// al final de este método.
	std::vector<System::SharedPtr<Node>> nodeList;

	for (System::SharedPtr<FieldStart> start : System::IterateOver<System::SharedPtr<FieldStart>>(doc->GetChildNodes(NodeType::FieldStart, true)))
	{
		if (start->get_FieldType() == FieldType::FieldTOC)
		{
			// Agregue todos los FieldStarts que sean de tipo FieldTOC.
			fieldStarts.push_back(start);
		}
	}

	// Asegúrese de que exista la TOC especificada por el índice pasado.
	if (index > fieldStarts.size() - 1)
	{
		throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
	}

	bool isRemoving = true;

	// Obtenga el FieldStart del TOC especificado.
	System::SharedPtr<Node> currentNode = fieldStarts[index];

	while (isRemoving)
	{
		// Es más seguro almacenar estos nodos y luego eliminarlos todos a la vez.
		nodeList.push_back(currentNode);
		currentNode = currentNode->NextPreOrder(doc);

		// Una vez que encontramos un nodo FieldEnd de tipo FieldTOC, sabemos que estamos al final
		// del TOC actual y podemos detenernos aquí.
		if (currentNode->get_NodeType() == NodeType::FieldEnd)
		{
			System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
			if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
			{
				isRemoving = false;
			}
		}
	}

	// Elimina todos los nodos que se encuentran en la tabla de contenido especificada.
	for (System::SharedPtr<Node> node : nodeList)
	{
		node->Remove();
	}
}

int main()
{
	// Rutas de directorio de origen y salida.
	System::String sourceDataDir = u"SourceDirectory\\";
	System::String outputDataDir = u"OutputDirectory\\";

	// Abrir un documento de Word
	System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");

	// Elimina la primera tabla de contenido del documento.
	RemoveTableOfContents(doc, 0);

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

	// Guarde el archivo de Word
	doc->Save(outputPath);
}

Obtenga una licencia gratis

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

Conclusión

En este artículo, ha aprendido a trabajar con la tabla de contenido en documentos de Word utilizando C++. Ha visto los pasos y el código de muestra necesarios para agregar, extraer, actualizar y eliminar la tabla de contenido de los documentos de Word. Aspose.Words for C++ proporciona muchas funciones adicionales para trabajar con archivos de Word. Puede explorar la API 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