Table of Contents (TOC) adalah bagian penting dari Dokumen Word. Ini memberikan ikhtisar konten dokumen dan memungkinkan Anda menavigasi ke bagian yang diinginkan dengan cepat. Anda mungkin menemukan diri Anda dalam skenario di mana Anda perlu menambah, mengekstrak, memperbarui, atau menghapus daftar isi dari dokumen Word secara terprogram. Untuk itu, artikel ini akan mengajarkan Anda cara bekerja dengan daftar isi di file Word menggunakan C++.

C++ API untuk Bekerja dengan Daftar Isi di Dokumen Word

Aspose.Words for C++ adalah pustaka C++ asli yang memungkinkan Anda membuat, membaca, memodifikasi, dan mengonversi dokumen Microsoft Word. Selain itu, ini juga mendukung bekerja dengan daftar isi di file Word. Anda dapat menginstal API melalui NuGet atau mengunduhnya langsung dari bagian Unduhan.

PM> Install-Package Aspose.Words.Cpp

Tambahkan Daftar Isi dalam Dokumen Word

Berikut ini adalah langkah-langkah untuk menambahkan daftar isi pada dokumen Word.

Kode contoh berikut menunjukkan cara menambahkan daftar isi dalam dokumen Word menggunakan C++.

// Jalur direktori sumber dan keluaran.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";

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

// Buat instance dari kelas DocumentBuilder
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);

// Sisipkan daftar isi di awal dokumen.
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");

// Daftar isi yang baru dimasukkan awalnya akan kosong.
// Itu perlu diisi dengan memperbarui bidang dalam dokumen.
doc->UpdateFields();

// Jalur file keluaran
System::String outputPath = outputDataDir + u"AddTOC.docx";

// Simpan file Word
doc->Save(outputPath);
Keluaran file Word yang berisi Daftar Isi

Keluaran file Word yang berisi Daftar Isi

Ekstrak Daftar Isi dari Dokumen Word

Berikut ini adalah langkah-langkah untuk mengekstrak daftar isi dari dokumen Word.

Kode contoh berikut menunjukkan cara mengekstrak daftar isi dari dokumen Word menggunakan C++.

// Direktori sumber
System::String inputDataDir = u"SourceDirectory\\";

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

// Loop melalui bidang
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
	// Dapatkan bidang FieldHyperlink
	if (field->get_Type() == FieldType::FieldHyperlink)
	{
		System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);

		// Periksa apakah bidang milik 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());

				// Dapatkan lokasi yang ditunjuk Item TOC ini
				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;
			}
		}
	}
}

Perbarui Daftar Isi dalam Dokumen Word

Jika konten dokumen telah diperbarui, dan Anda perlu mencerminkan perubahan tersebut di daftar isi, Anda hanya perlu memuat file Word dan memanggil metode Document->UpdateFields(). Metode ini akan memperbarui daftar isi sesuai dengan konten yang dimodifikasi. Setelah ini, simpan dokumen Word yang diperbarui.

Hapus Daftar Isi dari Dokumen Word

Berikut ini adalah langkah-langkah untuk menghapus daftar isi dari dokumen Word.

Kode contoh berikut menunjukkan cara menghapus daftar isi dari Dokumen Word menggunakan C++.

void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
	// Simpan node FieldStart dari bidang TOC dalam dokumen untuk akses cepat.
	std::vector<System::SharedPtr<FieldStart>> fieldStarts;
	// Ini adalah daftar untuk menyimpan node yang ditemukan di dalam TOC yang ditentukan. Mereka akan dihapus
	// pada akhir metode ini.
	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)
		{
			// Tambahkan semua FieldStarts yang bertipe FieldTOC.
			fieldStarts.push_back(start);
		}
	}

	// Pastikan bahwa TOC yang ditentukan oleh indeks yang diteruskan ada.
	if (index > fieldStarts.size() - 1)
	{
		throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
	}

	bool isRemoving = true;

	// Dapatkan FieldStart dari TOC yang ditentukan.
	System::SharedPtr<Node> currentNode = fieldStarts[index];

	while (isRemoving)
	{
		// Lebih aman untuk menyimpan node ini dan menghapusnya sekaligus nanti.
		nodeList.push_back(currentNode);
		currentNode = currentNode->NextPreOrder(doc);

		// Setelah kami menemukan simpul FieldEnd bertipe FieldTOC, maka kami tahu bahwa kami berada di akhir
		// dari TOC saat ini dan kita bisa berhenti di sini.
		if (currentNode->get_NodeType() == NodeType::FieldEnd)
		{
			System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
			if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
			{
				isRemoving = false;
			}
		}
	}

	// Hapus semua node yang ditemukan di TOC yang ditentukan.
	for (System::SharedPtr<Node> node : nodeList)
	{
		node->Remove();
	}
}

int main()
{
	// Jalur direktori sumber dan keluaran.
	System::String sourceDataDir = u"SourceDirectory\\";
	System::String outputDataDir = u"OutputDirectory\\";

	// Buka dokumen Word
	System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");

	// Hapus daftar isi pertama dari dokumen.
	RemoveTableOfContents(doc, 0);

	// Jalur file keluaran
	System::String outputPath = outputDataDir + u"RemoveTOC.docx";

	// Simpan file Word
	doc->Save(outputPath);
}

Dapatkan Lisensi Gratis

Anda dapat mencoba API tanpa batasan evaluasi dengan meminta lisensi sementara gratis.

Kesimpulan

Pada artikel ini, Anda telah mempelajari cara bekerja dengan daftar isi dalam dokumen Word menggunakan C++. Anda telah melihat langkah-langkah dan contoh kode yang diperlukan untuk menambah, mengekstrak, memperbarui, dan menghapus daftar isi dari dokumen Word. Aspose.Words for C++ menyediakan banyak fitur tambahan untuk bekerja dengan file Word. Anda dapat menjelajahi API secara mendetail dengan mengunjungi dokumentasi resmi. Jika ada pertanyaan, jangan ragu untuk menghubungi kami di [forum dukungan gratis] kami21.

Lihat juga