두 개의 Word 파일을 비교했을 때 유일한 차이가 목록 번호 매김 방식이라면, 예를 들어 1.과 2.였던 조항이 이제 a.와 b.가 되거나 번호 매긴 목록이 글머리표 목록으로 바뀐 경우, Aspose.Words는 기본적으로 차이가 없다고 보고합니다. 이 튜토리얼에서는 Python에서 Word 파일을 비교할 때 번호 매김 변경을 감지하는 방법을 보여줍니다. 또한 발견된 변경 사항을 검토하고, 수락하거나 거부하는 방법도 설명합니다.
핵심 요약
- 기본적으로 목록의 번호 매기기 스타일이나 글머리 기호 문자가 변경되어도 Word 파일을 비교할 때 수정 사항이 생성되지 않습니다.
options.advanced_options.compare_list_definitions = True를 설정하면 영향을 받은 각 목록 단락이FORMAT_CHANGE수정으로 보고됩니다.- 목록 항목 내부의 텍스트 변경은 항상 보고됩니다. 이 옵션은 번호 매기기 및 글머리 기호 변경만 추가합니다.
ignore_formatting=True를 사용하면 옵션이 켜져 있어도 번호 매기기 변경이 숨겨집니다.
왜 번호 매기기 변경이 기본적으로 표시되지 않을까
Word의 번호 매기기와 글머리표는 목록 정의에서 가져옵니다. 목록 정의는 각 수준이 어떻게 표시되는지를 설명합니다: 번호 스타일(1., a., i.), 글머리표 문자 및 관련 서식입니다. 문서를 비교할 때, Aspose.Words는 기본적으로 Microsoft Word를 따르며 목록 정의를 비교에서 제외합니다. 따라서 번호만 변경된 경우, 비교 결과에 아무것도 표시되지 않습니다.
compare_list_definitions 옵션은 Word에 해당하는 것이 없습니다. 이 옵션은 Aspose.Words에 비교 시 목록 정의를 포함하도록 지시합니다. 버전 26.9에서 두 항목 목록을 비교했을 때 본 내용은 다음과 같습니다:
| 원본 목록 | 편집된 목록 | 옵션 끔 | 옵션 켬 |
|---|---|---|---|
번호 매긴 1. 2. | 글머리 기호 | 0개의 수정 | 2 FORMAT_CHANGE |
번호 매긴 1. 2. | 문자형 a. b. | 0개의 수정 | 2 FORMAT_CHANGE |
| 번호 매긴, “항목 2” | 글머리 기호, “항목 두” | 2 (DELETION, INSERTION) | 4 (adds 2 FORMAT_CHANGE) |
| 번호 매긴 | 동일한 번호 목록 | 0개의 수정 | 0개의 수정 |
실제로 마지막 행이 중요합니다. 옵션을 켜면 두 파일 모두에서 동일한 목록에 대해 추가 개정이 생성되지 않습니다.
사전 요구 사항
Aspose.Words for Python via .NET 26.9 또는 그 이후 버전이 필요합니다. PyPI에서 설치하거나 업그레이드하십시오: PyPI
pip install --upgrade "aspose-words>=26.9"
라이선스가 없으면 Aspose.Words는 제한이 있는 평가 모드로 실행됩니다. 임시 라이선스를 사용하면 테스트 중에 이러한 제한이 해제됩니다.
차이점 보기: 옵션 사용 여부에 따른 번호 매기기 변경
다음 스크립트는 동일한 두 항목을 포함하는 두 개의 문서를 생성합니다. 첫 번째는 번호 매기기 목록을 사용하고, 두 번째는 글머리표 목록을 사용합니다. 옵션을 끈 상태와 켠 상태에서 각각 두 번 비교하므로 옵션이 정확히 어떻게 변경되는지 확인할 수 있습니다.
import datetime
import aspose.words as aw
def build_list_document(bulleted: bool) -> aw.Document:
"""Create a two-item list, either numbered or bulleted."""
doc = aw.Document()
builder = aw.DocumentBuilder(doc=doc)
if bulleted:
builder.list_format.apply_bullet_default()
else:
builder.list_format.apply_number_default()
builder.writeln("Item 1")
builder.writeln("Item 2")
builder.list_format.remove_numbers()
return doc
def compare_lists(compare_list_definitions: bool) -> aw.Document:
original = build_list_document(bulleted=False)
edited = build_list_document(bulleted=True)
options = aw.comparing.CompareOptions()
options.advanced_options.compare_list_definitions = compare_list_definitions
# compare() writes revisions into `original`; it returns nothing.
original.compare(
document=edited,
author="Reviewer",
date_time=datetime.datetime.now(),
options=options,
)
return original
for flag in (False, True):
result = compare_lists(flag)
print(f"compare_list_definitions={flag}: {result.revisions.count} revision(s)")
for revision in result.revisions:
revision_type = aw.RevisionType(revision.revision_type).name
text = revision.parent_node.get_text().strip()
print(f" {revision_type}: {text}")
result.save("compared-lists.docx")
스크립트를 실행하면 출력됩니다:
compare_list_definitions=False: 0 revision(s)
compare_list_definitions=True: 2 revision(s)
FORMAT_CHANGE: Item 1
FORMAT_CHANGE: Item 2
코드 작동 방식
build_list_document은DocumentBuilder.list_format을 사용하여 기본 번호 매기기 또는 글머리표 목록을 시작하고, 두 개의 항목을 작성한 다음remove_numbers()를 호출하여 이후 단락이 목록의 일부가 되지 않도록 합니다.CompareOptions.advanced_options은compare_list_definitions를 노출하며, 기본값은False입니다.original.compare(...)은original를edited와 비교하고 차이를original내부의 수정본으로 기록합니다. 이 메서드는None을 반환하므로, 항상 호출한 문서에서 결과를 확인하십시오.- 각 수정본의
parent_node는 서식이 변경된 목록 단락입니다.revision_type은 번호 매기기 및 글머리표 변경에 대해RevisionType.FORMAT_CHANGE입니다.
두 Word 파일 간 번호 매기기 변경 감지
실제 워크플로에서는 계약서 두 버전과 같이 기존 파일 두 개를 비교합니다. 이러한 비교에는 일반적으로 다른 수정 사항도 포함되므로, 아래 스크립트는 목록 단락에 적용된 서식 변경만 유지합니다.
import datetime
import aspose.words as aw
original = aw.Document("contract-v1.docx")
edited = aw.Document("contract-v2.docx")
options = aw.comparing.CompareOptions()
options.advanced_options.compare_list_definitions = True
original.compare(edited, "Reviewer", datetime.datetime.now(), options)
# Keep only formatting revisions that sit on list paragraphs.
list_changes = [
rev for rev in original.revisions
if rev.revision_type == aw.RevisionType.FORMAT_CHANGE
and rev.parent_node is not None
and rev.parent_node.node_type == aw.NodeType.PARAGRAPH
and rev.parent_node.as_paragraph().list_format.is_list_item
]
print(f"Total revisions: {original.revisions.count}")
print(f"Formatting changes on list paragraphs: {len(list_changes)}")
for rev in list_changes:
print(f" {rev.parent_node.get_text().strip()}")
original.save("contract-compared.docx")
우리 테스트에서, 계약서 버전 2는 번호 매기기 목록을 글머리표로 변경하고 관련 없는 문장을 굵게 만들었습니다. 출력은 다음과 같습니다:
Total revisions: 5
Formatting changes on list paragraphs: 2
Invoices are due in 30 days.
Late fees apply after 45 days.
필터는 두 개의 목록 항목을 선택하고 굵게 변경된 부분은 건너뜁니다. 이는 해당 수정이 목록 단락이 아니라 텍스트에 적용되기 때문입니다. 목록 항목에 대한 단락 수준 서식 변경(예: 번호가 아니라 들여쓰기 변경)과 일치한다는 점을 기억하세요. 이러한 차이를 구분하려면 저장된 문서를 확인하십시오.
번호 매기기 변경 검토, 수락 또는 거부
번호 매기기 변경은 일반적인 형식 수정이므로, 다른 수정과 동일한 방식으로 처리합니다:
revisions.accept_all()는 편집된 목록 서식을 적용합니다. 첫 번째 예제에서는 두 항목 모두 글머리표가 됩니다.revisions.reject_all()는 원래 서식을 유지하므로 항목이1.및2.번호로 남습니다.- 문서를 저장하면 수정 사항이 추적 변경으로 기록되므로 검토자는 Microsoft Word에서 파일을 열어 각 변경을 직접 결정할 수 있습니다.
예를 들어 이전 섹션의 list_changes 목록에 있는 항목들만 대상으로, 개별 Revision 객체에 대해 accept() 또는 reject()를 호출할 수도 있습니다.
번호 매기기 변경 감지 시점
옵션을 켜면 목록의 번호 매기기가 검토자에게 의미가 있을 때 사용합니다. 법률 및 정책 문서가 일반적인 사례입니다: 조항 번호를 1.에서 (a)로 변경하면 다른 문서에서 해당 조항을 참조하는 방식이 바뀌므로 검토자가 이를 확인해야 합니다. 또한 시스템 간에 문서를 마이그레이션할 때 목록 번호 매기기가 변형 없이 그대로 유지되었는지 확인하는 데도 유용합니다.
문구만 신경 쓸 때는 이를 끄세요. 콘텐츠 검토, 번역 확인 및 텍스트 수준 차이는 형식 수정이 섞여 있지 않아 읽기 쉽습니다.
Things to Watch For
ignore_formattingoverrides the option. If you setoptions.ignore_formatting = True, numbering changes are not reported, even withcompare_list_definitions = True.- Files must not contain revisions before you compare them. If either document already has tracked changes,
compareraises aRuntimeErrorsaying that compared documents must not have revisions. Accept or reject existing revisions first. This also means you can’t run a second comparison on a document that already holds the results of the first; reload the files each time. - Other revisions still appear. Inserted or deleted text in a list item is reported whether the option is on or off, so check
revision_typeif you need to separate numbering changes from wording changes.
다음 단계
Aspose.Words for Python 문서의 Compare Documents 기사에서는 세분성, 비교 대상 및 무시 옵션을 포함한 기타 비교 설정을 다룹니다.
FAQs
왜 Aspose.Words는 Word 파일을 비교할 때 번호 매기기 변경을 감지하지 못하나요? 기본적으로 Aspose.Words는 Microsoft Word와 동일하게 동작하며, 번호 매기기 스타일이나 글머리 기호와 같은 목록 정의를 비교에서 제외합니다. 번호에서 글머리 기호로 변경되는 목록은
compare_list_definitions를 활성화하지 않으면 수정 사항이 생성되지 않습니다.Python에서 번호 매기기 변경을 어떻게 감지합니까?
CompareOptions를 생성하고,options.advanced_options.compare_list_definitions를True로 설정한 다음, 옵션을Document.compare에 전달합니다. 번호 매기기 또는 글머리 기호가 변경된 각 리스트 단락은FORMAT_CHANGE수정 사항을 받습니다.번호 매김 변경이 어떤 종류의 수정(revision)을 생성합니까? 각 영향을 받은 목록 단락은
RevisionType.FORMAT_CHANGE유형의 수정을 받습니다. 이를 수락하면 편집된 파일의 목록 서식이 적용되고, 거부하면 원본이 유지됩니다.옵션이 ignore_formatting과 함께 작동합니까? 아니요.
CompareOptions.ignore_formatting이True이면,compare_list_definitions가True일지라도 번호 변경이 보고되지 않습니다.Document.compare는 무엇을 반환합니까?
없음. 차이점을 호출한 문서에 수정본으로 기록하므로 해당 문서의revisions컬렉션에서 읽어야 합니다.Aspose.Words for Python의 어느 버전에서 이 옵션이 추가되었나요?
AdvancedCompareOptions의compare_list_definitions속성은 Aspose.Words for Python via .NET 26.9에 추가되었습니다.
