İçindekiler Tablosu (TOC), bir Word Belgesinin önemli bir parçasıdır. Belgenin içeriğine genel bir bakış sağlar ve istediğiniz bölüme hızlı bir şekilde gitmenizi sağlar. Kendinizi programlı olarak Word belgelerinden içindekiler tablosunu eklemeniz, ayıklamanız, güncellemeniz veya içindekiler tablosunu kaldırmanız gereken senaryolarda bulabilirsiniz. Bu amaçla, bu makale size C++ kullanarak Word dosyalarındaki içindekiler tablosuyla nasıl çalışacağınızı öğretecektir.
- Word Belgelerinde İçindekiler ile Çalışmak için C++ API
- Bir Word Belgesine İçindekiler Tablosunu Ekleme
- İçindekiler Tablosunu bir Word Belgesinden Çıkarın
- Bir Word Belgesindeki İçindekiler Tablosunu Güncelleme
- İçindekiler Tablosunu Word Belgesinden Kaldırma
Word Belgelerinde İçindekiler ile Çalışmak için C++ API
Aspose.Words for C++, Microsoft Word belgeleri oluşturmanıza, okumanıza, değiştirmenize ve dönüştürmenize olanak sağlayan yerel bir C++ kitaplığıdır. Ayrıca, Word dosyalarındaki içindekiler tablosuyla çalışmayı da destekler. API’yi NuGet aracılığıyla yükleyebilir veya doğrudan İndirilenler bölümünden indirebilirsiniz.
PM> Install-Package Aspose.Words.Cpp
Bir Word Belgesine İçindekiler Tablosunu Ekleme
Aşağıdakiler, bir Word belgesine içindekiler tablosu ekleme adımlarıdır.
- Belge sınıfını kullanarak Word dosyasını yükleyin.
- Daha önce oluşturulan Document nesnesini kullanarak DocumentBuilder sınıfının bir örneğini oluşturun.
- DocumentBuilder->InsertTableOfContents(System::String switchs) yöntemini kullanarak içindekiler tablosunu ekleyin.
- Document->UpdateFields() yöntemini kullanarak içindekiler tablosunu doldurun.
- Document->Save(System::String fileName) yöntemini kullanarak Word belgesini kaydedin.
Aşağıdaki örnek kod, C++ kullanarak bir Word belgesine içindekiler tablosunun nasıl ekleneceğini gösterir.
// Kaynak ve çıktı dizini yolları.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Word dosyasını yükleyin
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");
// DocumentBuilder sınıfının bir örneğini oluşturun
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);
// Belgenin başına bir içindekiler tablosu ekleyin.
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");
// Yeni eklenen içindekiler tablosu başlangıçta boş olacaktır.
// Belgedeki alanlar güncellenerek doldurulması gerekir.
doc->UpdateFields();
// Çıktı dosyası yolu
System::String outputPath = outputDataDir + u"AddTOC.docx";
// Word dosyasını kaydedin
doc->Save(outputPath);
İçindekiler Tablosunu bir Word Belgesinden Çıkarın
Aşağıdakiler, bir Word belgesinden içindekiler tablosunu çıkarma adımlarıdır.
- Belge sınıfını kullanarak Word dosyasını yükleyin.
- Document->getRange()->getFields() yöntemini kullanarak alanları alın ve üzerlerinde döngü yapın.
- Alanın FieldType::FieldHyperlink türünde olup olmadığını kontrol edin.
- Alanın içindekiler tablosuna ait olup olmadığını kontrol edin.
- Alan bilgilerini alın ve yazdırın.
Aşağıdaki örnek kod, içindekiler tablosunun C++ kullanılarak bir Word belgesinden nasıl çıkarılacağını gösterir.
// kaynak dizini
System::String inputDataDir = u"SourceDirectory\\";
// Word dosyasını yükleyin
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");
// Alanlar arasında döngü
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
// FieldHyperlink alanlarını al
if (field->get_Type() == FieldType::FieldHyperlink)
{
System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);
// Alanın içindekilere ait olup olmadığını kontrol edin
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());
// Bu İçindekiler Öğesinin işaret ettiği konumu al
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;
}
}
}
}
Bir Word Belgesindeki İçindekiler Tablosunu Güncelleme
Belgenin içeriği güncellendiyse ve bu değişiklikleri içindekiler tablosuna yansıtmanız gerekiyorsa, Word dosyasını yüklemeniz ve Document->UpdateFields() yöntemini çağırmanız yeterlidir. Bu yöntem, içindekiler tablosunu değiştirilen içeriğe göre güncelleyecektir. Bundan sonra, güncellenmiş Word belgesini kaydedin.
İçindekiler Tablosunu Word Belgesinden Kaldırma
Aşağıdakiler, bir Word belgesinden içindekiler tablosunu kaldırma adımlarıdır.
- Belge sınıfını kullanarak Word dosyasını yükleyin.
- FieldStart düğümlerinin bir listesini alın ve saklayın.
- İçindekiler tablosunun sonunu belirten NodeType::FieldEnd türündeki düğüme ulaşana kadar düğümler arasında döngü yapın.
- Node->Remove() yöntemini kullanarak içindekiler tablosunu kaldırın.
- Document->Save(System::String fileName) yöntemini kullanarak Word belgesini kaydedin.
Aşağıdaki örnek kod, içindekiler tablosunun C++ kullanılarak bir Word Belgesinden nasıl kaldırılacağını gösterir.
void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
// Hızlı erişim için içindekiler alanlarının FieldStart düğümlerini belgede saklayın.
std::vector<System::SharedPtr<FieldStart>> fieldStarts;
// Bu, belirtilen TOC içinde bulunan düğümleri depolamak için bir listedir. Kaldırılacaklar
// Bu yöntemin sonunda.
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)
{
// FieldTOC tipindeki tüm FieldStart'ları ekleyin.
fieldStarts.push_back(start);
}
}
// Geçirilen dizin tarafından belirtilen TOC'nin var olduğundan emin olun.
if (index > fieldStarts.size() - 1)
{
throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
}
bool isRemoving = true;
// Belirtilen İçindekilerin FieldStart'ını alın.
System::SharedPtr<Node> currentNode = fieldStarts[index];
while (isRemoving)
{
// Bu düğümleri saklamak ve daha sonra hepsini birden silmek daha güvenlidir.
nodeList.push_back(currentNode);
currentNode = currentNode->NextPreOrder(doc);
// FieldTOC türünde bir FieldEnd düğümüyle karşılaştığımızda, sonunda olduğumuzu anlarız
// mevcut TOC ve burada durabiliriz.
if (currentNode->get_NodeType() == NodeType::FieldEnd)
{
System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
{
isRemoving = false;
}
}
}
// Belirtilen İçindekiler'de bulunan tüm düğümleri kaldırın.
for (System::SharedPtr<Node> node : nodeList)
{
node->Remove();
}
}
int main()
{
// Kaynak ve çıktı dizini yolları.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Bir Word belgesi açın
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");
// İlk içindekiler tablosunu belgeden kaldırın.
RemoveTableOfContents(doc, 0);
// Çıktı dosyası yolu
System::String outputPath = outputDataDir + u"RemoveTOC.docx";
// Word dosyasını kaydedin
doc->Save(outputPath);
}
Ücretsiz Lisans Alın
Ücretsiz bir geçici lisans talep ederek API’yi değerlendirme sınırlamaları olmaksızın deneyebilirsiniz.
Çözüm
Bu makalede, C++ kullanarak Word belgelerindeki içindekiler tablosuyla nasıl çalışılacağını öğrendiniz. Word belgelerinden içindekiler tablosunu eklemek, ayıklamak, güncellemek ve kaldırmak için gereken adımları ve örnek kodu gördünüz. Aspose.Words for C++, Word dosyalarıyla çalışmak için birçok ek özellik sağlar. Resmi belgeleri ziyaret ederek API’yi ayrıntılı olarak inceleyebilirsiniz. Herhangi bir sorunuz olursa lütfen ücretsiz destek forumumuzda bize ulaşmaktan çekinmeyin.