목차(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 문서에 목차를 추가하는 단계입니다.
- Document 클래스를 사용하여 Word 파일을 로드합니다.
- 이전에 생성한 Document 객체를 사용하여 DocumentBuilder 클래스의 인스턴스를 생성합니다.
- DocumentBuilder->InsertTableOfContents(System::String switch) 메서드를 사용하여 목차를 삽입합니다.
- Document->UpdateFields() 메서드를 사용하여 목차를 채웁니다.
- Document->Save(System::String fileName) 메서드를 사용하여 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 문서에서 목차를 추출하는 단계입니다.
- Document 클래스를 사용하여 Word 파일을 로드합니다.
- Document->get_Range()->get_Fields() 메서드를 사용하여 필드를 검색하고 반복합니다.
- 필드가 FieldType::FieldHyperlink 유형인지 확인합니다.
- 필드가 목차에 속하는지 확인하십시오.
- 필드 정보를 검색하고 인쇄합니다.
다음 샘플 코드는 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 문서에서 목차를 제거하는 단계입니다.
- Document 클래스를 사용하여 Word 파일을 로드합니다.
- FieldStart 노드 목록을 검색하고 저장합니다.
- 목차의 끝을 지정하는 NodeType::FieldEnd 유형의 노드에 도달할 때까지 노드를 반복합니다.
- Node->Remove() 메서드를 사용하여 목차를 제거합니다.
- Document->Save(System::String fileName) 메서드를 사용하여 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를 자세히 살펴보실 수 있습니다. 질문이 있는 경우 무료 지원 포럼을 통해 언제든지 문의하십시오.