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
- Agregar la tabla de contenido en un documento de Word
- Extraiga la tabla de contenido de un documento de Word
- Actualizar la tabla de contenido en un documento de Word
- Eliminar la tabla de contenido de un documento de Word
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.
- Cargue el archivo de Word usando la clase Document.
- Cree una instancia de la clase DocumentBuilder utilizando el objeto Document creado anteriormente.
- Inserte la tabla de contenido usando el método DocumentBuilder->InsertTableOfContents(System::String switches).
- Complete la tabla de contenido usando el método Document->UpdateFields().
- Guarde el documento de Word utilizando el método Document->Save(System::String fileName).
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);
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.
- Cargue el archivo de Word usando la clase Document.
- Recupere los campos usando el método Document->get_Range()->get_Fields() y recorra sobre ellos.
- Compruebe si el campo es del tipo FieldType::FieldHyperlink.
- Compruebe si el campo pertenece a la tabla de contenido.
- Recuperar e imprimir la información del campo.
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.
- Cargue el archivo de Word usando la clase Document.
- Recupere y almacene una lista de los nodos FieldStart.
- Recorra los nodos hasta llegar al nodo del tipo NodeType::FieldEnd que designa el final de la tabla de contenido.
- Elimine la tabla de contenido usando el método Node->Remove().
- Guarde el documento de Word usando el método Document->Save(System::String fileName).
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.