목차(TOC)는 Word 문서의 중요한 부분입니다. 문서 내용에 대한 개요를 제공하고 원하는 섹션으로 빠르게 이동할 수 있습니다. 프로그래밍 방식으로 Word 문서에서 목차를 추가, 추출, 업데이트 또는 제거해야 하는 시나리오에 직면할 수 있습니다. 이를 위해 이 기사에서는 C++를 사용하여 Word 파일의 목차를 사용하는 방법을 알려줍니다.

Word 문서의 목차 작업을 위한 C++ API

Aspose.Words for C++는 Microsoft Word 문서를 생성, 읽기, 수정 및 변환할 수 있는 네이티브 C++ 라이브러리입니다. 또한 Word 파일의 목차 작업도 지원합니다. NuGet을 통해 API를 설치하거나 다운로드 섹션에서 직접 다운로드할 수 있습니다.

PM> Install-Package Aspose.Words.Cpp

Word 문서에 목차 추가

다음은 Word 문서에 목차를 추가하는 단계입니다.

다음 샘플 코드는 C++를 사용하여 Word 문서에 목차를 추가하는 방법을 보여줍니다.

// 소스 및 출력 디렉토리 경로.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";

// 워드 파일 불러오기
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");

// DocumentBuilder 클래스의 인스턴스 만들기
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);

// 문서의 시작 부분에 목차를 삽입합니다.
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");

// 새로 삽입된 목차는 처음에는 비어 있습니다.
// 문서의 필드를 업데이트하여 채워야 합니다.
doc->UpdateFields();

// 출력 파일 경로
System::String outputPath = outputDataDir + u"AddTOC.docx";

// 워드 파일 저장
doc->Save(outputPath);
목차가 포함된 출력 Word 파일

목차가 포함된 출력 Word 파일

Word 문서에서 목차 추출

다음은 Word 문서에서 목차를 추출하는 단계입니다.

다음 샘플 코드는 C++를 사용하여 Word 문서에서 목차를 추출하는 방법을 보여줍니다.

// 소스 디렉토리
System::String inputDataDir = u"SourceDirectory\\";

// 워드 파일 불러오기
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");

// 필드 반복
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
	// FieldHyperlink 필드 가져오기
	if (field->get_Type() == FieldType::FieldHyperlink)
	{
		System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);

		// 필드가 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());

				// 이 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;
			}
		}
	}
}

Word 문서에서 목차 업데이트

문서의 내용이 업데이트되었고 이러한 변경 사항을 목차에 반영해야 하는 경우 Word 파일을 로드하고 Document->UpdateFields() 메서드를 호출하기만 하면 됩니다. 이 메서드는 수정된 내용에 따라 목차를 업데이트합니다. 그런 다음 업데이트된 Word 문서를 저장합니다.

Word 문서에서 목차 제거

다음은 Word 문서에서 목차를 제거하는 단계입니다.

다음 샘플 코드는 C++를 사용하여 Word 문서에서 목차를 제거하는 방법을 보여줍니다.

void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
	// 빠른 액세스를 위해 문서에 TOC 필드의 FieldStart 노드를 저장합니다.
	std::vector<System::SharedPtr<FieldStart>> fieldStarts;
	// 지정된 TOC 내에서 찾은 노드를 저장하는 목록입니다. 그들은 제거됩니다
	// 이 방법의 끝에서.
	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 유형인 모든 FieldStart를 추가합니다.
			fieldStarts.push_back(start);
		}
	}

	// 전달된 인덱스에 의해 지정된 TOC가 존재하는지 확인하십시오.
	if (index > fieldStarts.size() - 1)
	{
		throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
	}

	bool isRemoving = true;

	// 지정된 TOC의 FieldStart를 가져옵니다.
	System::SharedPtr<Node> currentNode = fieldStarts[index];

	while (isRemoving)
	{
		// 이러한 노드를 저장하고 나중에 한 번에 모두 삭제하는 것이 더 안전합니다.
		nodeList.push_back(currentNode);
		currentNode = currentNode->NextPreOrder(doc);

		// FieldTOC 유형의 FieldEnd 노드를 만나면 끝임을 알 수 있습니다.
		// 현재 TOC에 대해 설명하고 여기서 멈출 수 있습니다.
		if (currentNode->get_NodeType() == NodeType::FieldEnd)
		{
			System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
			if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
			{
				isRemoving = false;
			}
		}
	}

	// 지정된 TOC에서 찾은 모든 노드를 제거합니다.
	for (System::SharedPtr<Node> node : nodeList)
	{
		node->Remove();
	}
}

int main()
{
	// 소스 및 출력 디렉토리 경로.
	System::String sourceDataDir = u"SourceDirectory\\";
	System::String outputDataDir = u"OutputDirectory\\";

	// 워드 문서 열기
	System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");

	// 문서에서 첫 번째 목차를 제거합니다.
	RemoveTableOfContents(doc, 0);

	// 출력 파일 경로
	System::String outputPath = outputDataDir + u"RemoveTOC.docx";

	// 워드 파일 저장
	doc->Save(outputPath);
}

무료 라이선스 받기

무료 임시 라이선스를 요청하면 평가 제한 없이 API를 사용해 볼 수 있습니다.

결론

이 기사에서는 C++를 사용하여 Word 문서의 목차로 작업하는 방법을 배웠습니다. Word 문서에서 목차를 추가, 추출, 업데이트 및 제거하는 데 필요한 단계와 샘플 코드를 살펴보았습니다. Aspose.Words for C++는 Word 파일 작업을 위한 많은 추가 기능을 제공합니다. 공식문서를 방문하시면 API를 자세히 살펴보실 수 있습니다. 질문이 있는 경우 무료 지원 포럼을 통해 언제든지 문의하십시오.

또한보십시오