İç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

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.

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 içeren Çıktı Word dosyası

İçindekiler Tablosunu içeren Çıktı Word dosyası

İç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.

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.

Ayrıca bakınız