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
- Aggiungi il sommario in un documento di Word
- Estrai il sommario da un documento di Word
- Aggiorna il sommario in un documento di Word
- Rimuovere il sommario da un documento di Word
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.
- Carica il file di Word usando la classe Document.
- Crea un’istanza della classe DocumentBuilder utilizzando l’oggetto Document creato in precedenza.
- Inserire il sommario utilizzando il metodo DocumentBuilder->InsertTableOfContents(System::String switch).
- Popolare il sommario utilizzando il metodo Document->UpdateFields().
- Salva il documento di Word usando il metodo Document->Save(System::String fileName).
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);
Estrai il sommario da un documento di Word
Di seguito sono riportati i passaggi per estrarre il sommario da un documento di Word.
- Carica il file di Word usando la classe Document.
- Recupera i campi usando il metodo Document->getRange()->getFields() e passaci sopra.
- Verificare se il campo è del tipo FieldType::FieldHyperlink.
- Controlla se il campo appartiene al sommario.
- Recupera e stampa le informazioni sul campo.
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.
- Carica il file di Word usando la classe Document.
- Recupera e archivia un elenco dei nodi FieldStart.
- Scorri i nodi fino a raggiungere il nodo del tipo NodeType::FieldEnd che indica la fine del sommario.
- Rimuovere il sommario utilizzando il metodo Node->Remove().
- Salva il documento di Word usando il metodo Document->Save(System::String fileName).
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.