Índice (TOC) é uma parte importante de um documento do Word. Ele fornece uma visão geral do conteúdo do documento e permite que você navegue rapidamente para a seção desejada. Você pode se encontrar em cenários em que precisa adicionar, extrair, atualizar ou remover o índice de documentos do Word programaticamente. Para isso, este artigo ensinará como trabalhar com o índice em arquivos do Word usando C++.
- API C++ para trabalhar com índice em documentos do Word
- Adicionar o índice em um documento do Word
- Extraia o índice de um documento do Word
- Atualizar o índice em um documento do Word
- Remover o índice de um documento do Word
API C++ para trabalhar com índice em documentos do Word
Aspose.Words for C++ é uma biblioteca nativa de C++ que permite criar, ler, modificar e converter documentos do Microsoft Word. Além disso, também suporta o trabalho com o índice em arquivos do Word. Você pode instalar a API por meio do NuGet ou baixá-la diretamente da seção Downloads.
PM> Install-Package Aspose.Words.Cpp
Adicionar o índice em um documento do Word
A seguir estão as etapas para adicionar um índice em um documento do Word.
- Carregue o arquivo do Word usando a classe Document.
- Crie uma instância da classe DocumentBuilder usando o objeto Document criado anteriormente.
- Insira o índice usando o método DocumentBuilder->InsertTableOfContents(System::String switches).
- Preencha o índice usando o método Document->UpdateFields().
- Salve o documento do Word usando o método Document->Save(System::String fileName).
O código de exemplo a seguir mostra como adicionar um sumário em um documento do Word usando C++.
// Caminhos de diretório de origem e saída.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Carregar o arquivo do Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");
// Crie uma instância da classe DocumentBuilder
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);
// Insira um índice no início do documento.
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");
// O índice recém-inserido estará inicialmente vazio.
// Ele precisa ser preenchido atualizando os campos no documento.
doc->UpdateFields();
// Caminho do arquivo de saída
System::String outputPath = outputDataDir + u"AddTOC.docx";
// Salve o arquivo do Word
doc->Save(outputPath);
Extraia o índice de um documento do Word
A seguir estão as etapas para extrair o índice de um documento do Word.
- Carregue o arquivo do Word usando a classe Document.
- Recupere os campos usando o método Document->getRange()->getFields() e faça um loop sobre eles.
- Verifique se o campo é do tipo FieldType::FieldHyperlink.
- Verifique se o campo pertence ao índice.
- Recupere e imprima as informações do campo.
O código de exemplo a seguir demonstra como extrair o sumário de um documento do Word usando C++.
// Diretório de origem
System::String inputDataDir = u"SourceDirectory\\";
// Carregar o arquivo do Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");
// Percorra os campos
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
// Obter campos FieldHyperlink
if (field->get_Type() == FieldType::FieldHyperlink)
{
System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);
// Verifique se o campo pertence ao 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());
// Obtenha o local para o qual este item de sumário está apontando
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;
}
}
}
}
Atualizar o índice em um documento do Word
Se o conteúdo do documento foi atualizado e você precisa refletir essas alterações no índice, basta carregar o arquivo Word e chamar o método Document->UpdateFields(). Este método atualizará o índice de acordo com o conteúdo modificado. Depois disso, salve o documento do Word atualizado.
Remover o índice de um documento do Word
A seguir estão as etapas para remover o índice de um documento do Word.
- Carregue o arquivo do Word usando a classe Document.
- Recupere e armazene uma lista dos nós FieldStart.
- Faça um loop pelos nós até chegar ao nó do tipo NodeType::FieldEnd que designa o final do índice.
- Remova o índice usando o método Node->Remove().
- Salve o documento do Word usando o método Document->Save(System::String fileName).
O código de exemplo a seguir mostra como remover o índice de um documento do Word usando C++.
void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
// Armazene os nós FieldStart dos campos TOC no documento para acesso rápido.
std::vector<System::SharedPtr<FieldStart>> fieldStarts;
// Esta é uma lista para armazenar os nós encontrados dentro do TOC especificado. Eles serão removidos
// no final deste 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)
{
// Adicione todos os FieldStarts que são do tipo FieldTOC.
fieldStarts.push_back(start);
}
}
// Assegure-se de que o TOC especificado pelo índice passado exista.
if (index > fieldStarts.size() - 1)
{
throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
}
bool isRemoving = true;
// Obtenha o FieldStart do sumário especificado.
System::SharedPtr<Node> currentNode = fieldStarts[index];
while (isRemoving)
{
// É mais seguro armazenar esses nós e excluí-los todos de uma vez mais tarde.
nodeList.push_back(currentNode);
currentNode = currentNode->NextPreOrder(doc);
// Quando encontramos um nó FieldEnd do tipo FieldTOC, sabemos que estamos no final
// da TOC atual e podemos parar por aqui.
if (currentNode->get_NodeType() == NodeType::FieldEnd)
{
System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
{
isRemoving = false;
}
}
}
// Remova todos os nós encontrados no sumário especificado.
for (System::SharedPtr<Node> node : nodeList)
{
node->Remove();
}
}
int main()
{
// Caminhos de diretório de origem e saída.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Abra um documento do Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");
// Remova o primeiro índice do documento.
RemoveTableOfContents(doc, 0);
// Caminho do arquivo de saída
System::String outputPath = outputDataDir + u"RemoveTOC.docx";
// Salve o arquivo do Word
doc->Save(outputPath);
}
Obtenha uma licença gratuita
Você pode experimentar a API sem limitações de avaliação solicitando uma licença temporária gratuita.
Conclusão
Neste artigo, você aprendeu a trabalhar com o índice em documentos do Word usando C++. Você viu as etapas e o código de exemplo necessários para adicionar, extrair, atualizar e remover o índice de documentos do Word. Aspose.Words para C++ fornece muitos recursos adicionais para trabalhar com arquivos do Word. Você pode explorar a API em detalhes visitando a documentação oficial. Em caso de dúvidas, sinta-se à vontade para entrar em contato conosco em nosso fórum de suporte gratuito.