Il sommario (TOC) è una parte importante di un documento di Word. Fornisce una panoramica del contenuto del documento e consente di passare rapidamente alla sezione desiderata. Potresti trovarti in scenari in cui è necessario aggiungere, estrarre, aggiornare o rimuovere il sommario dai documenti di Word a livello di codice. A tal fine, questo articolo ti insegnerà come lavorare con il sommario nei file di Word usando C++.

API C++ per l’utilizzo del sommario nei documenti di Word

Aspose.Words for C++ è una libreria C++ nativa che consente di creare, leggere, modificare e convertire documenti Microsoft Word. Inoltre, supporta anche l’utilizzo del sommario nei file di Word. Puoi installare l’API tramite NuGet o scaricarla direttamente dalla sezione Download.

PM> Install-Package Aspose.Words.Cpp

Aggiungi il sommario in un documento di Word

Di seguito sono riportati i passaggi per aggiungere un sommario in un documento di Word.

Il codice di esempio seguente mostra come aggiungere un sommario in un documento di Word usando C++.

// Percorsi della directory di origine e di output.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";

// Carica il file di Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");

// Crea un'istanza della classe DocumentBuilder
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);

// Inserire un sommario all'inizio del documento.
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");

// Il sommario appena inserito sarà inizialmente vuoto.
// Deve essere compilato aggiornando i campi nel documento.
doc->UpdateFields();

// Percorso del file di output
System::String outputPath = outputDataDir + u"AddTOC.docx";

// Salva il file di Word
doc->Save(outputPath);
File di output di Word contenente il sommario

File di output di Word contenente il sommario

Estrai il sommario da un documento di Word

Di seguito sono riportati i passaggi per estrarre il sommario da un documento di Word.

Il codice di esempio seguente illustra come estrarre il sommario da un documento di Word utilizzando C++.

// Directory di origine
System::String inputDataDir = u"SourceDirectory\\";

// Carica il file di Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");

// Attraversa i campi
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
	// Ottieni campi FieldHyperlink
	if (field->get_Type() == FieldType::FieldHyperlink)
	{
		System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);

		// Verifica se il campo appartiene al sommario
		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());

				// Ottieni la posizione a cui punta questo oggetto 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;
			}
		}
	}
}

Aggiorna il sommario in un documento di Word

Se il contenuto del documento è stato aggiornato e devi riflettere tali modifiche nel sommario, devi semplicemente caricare il file di Word e chiamare il metodo Document->UpdateFields(). Questo metodo aggiornerà il sommario in base al contenuto modificato. Successivamente, salva il documento Word aggiornato.

Rimuovere il sommario da un documento di Word

Di seguito sono riportati i passaggi per rimuovere il sommario da un documento di Word.

Il codice di esempio seguente mostra come rimuovere il sommario da un documento di Word utilizzando C++.

void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
	// Archivia i nodi FieldStart dei campi TOC nel documento per un rapido accesso.
	std::vector<System::SharedPtr<FieldStart>> fieldStarts;
	// Questo è un elenco per memorizzare i nodi trovati all'interno del TOC specificato. Saranno rimossi
	// alla fine di questo metodo.
	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)
		{
			// Aggiungi tutti i FieldStart di tipo FieldTOC.
			fieldStarts.push_back(start);
		}
	}

	// Assicurarsi che il TOC specificato dall'indice passato esista.
	if (index > fieldStarts.size() - 1)
	{
		throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
	}

	bool isRemoving = true;

	// Ottieni il FieldStart del sommario specificato.
	System::SharedPtr<Node> currentNode = fieldStarts[index];

	while (isRemoving)
	{
		// È più sicuro archiviare questi nodi ed eliminarli tutti in una volta in un secondo momento.
		nodeList.push_back(currentNode);
		currentNode = currentNode->NextPreOrder(doc);

		// Una volta che incontriamo un nodo FieldEnd di tipo FieldTOC, sappiamo di essere alla fine
		// dell'attuale TOC e possiamo fermarci qui.
		if (currentNode->get_NodeType() == NodeType::FieldEnd)
		{
			System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
			if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
			{
				isRemoving = false;
			}
		}
	}

	// Rimuovere tutti i nodi trovati nel sommario specificato.
	for (System::SharedPtr<Node> node : nodeList)
	{
		node->Remove();
	}
}

int main()
{
	// Percorsi della directory di origine e di output.
	System::String sourceDataDir = u"SourceDirectory\\";
	System::String outputDataDir = u"OutputDirectory\\";

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

	// Rimuovere il primo sommario dal documento.
	RemoveTableOfContents(doc, 0);

	// Percorso del file di output
	System::String outputPath = outputDataDir + u"RemoveTOC.docx";

	// Salva il file di Word
	doc->Save(outputPath);
}

Ottieni una licenza gratuita

Puoi provare l’API senza limitazioni di valutazione richiedendo una licenza temporanea gratuita.

Conclusione

In questo articolo hai imparato a lavorare con il sommario nei documenti di Word usando C++. Hai visto i passaggi e il codice di esempio necessari per aggiungere, estrarre, aggiornare e rimuovere il sommario dai documenti di Word. Aspose.Words per C++ fornisce molte funzionalità aggiuntive per lavorare con i file di Word. Puoi esplorare l’API in dettaglio visitando la documentazione ufficiale. In caso di domande, non esitare a contattarci sul nostro forum di supporto gratuito.

Guarda anche