Nie patrz tylko na rozmiar czcionki w tytułach Worda: styl jest lepszą wskazówką strukturalną

Artykuł ten dokładnie rozwiązuje podstawowe problemy zawarte w briefie na temat stylu akapitu i zlokalizowanych nazw, a także zapewnia jasne granice wejściowe i wyjściowe, syntetyczny przykładowy kod do budowy pamięci, listę kontrolną akceptacji i sugestie dotyczące połączeń OmniDoc. Treść jest naturalna i przejrzysta, nie zawiera nadużyć API ani niebezpiecznych operacji, a wszystkie kwestie techniczne są poparte oryginalną dokumentacją.

Jeśli używasz skryptu do zbiorczego wyodrębniania spisu treści lub rozdziałów dokumentów programu Word, może się zdarzyć, że pominiesz „nagłówek pierwszego poziomu"lub pogrubiony tekst zostanie błędnie oceniony jako rozdział. Zwykle nie dzieje się tak dlatego, że wyrażenia regularne nie są napisane wystarczająco dobrze, ale dlatego, że akapit nie ma zastosowanego stylu tytułu, takiego jakHeading 1, ale rozmiar czcionki jest ręcznie zwiększany, a tekst jest pogrubiony. Podczas przetwarzania struktury dokumentu programu Word reprezentacja wizualna nie jest równa strukturze, a paragraph.style jest bardziej wiarygodną wskazówką semantyczną.

Poniższa treść jest odpowiednia dla programistów i inżynierów dokumentów odpowiedzialnych za automatyzację dokumentów, analizowanie wsadowe lub kontrolę przed tłumaczeniem. Przykłady w tym artykule wykorzystują próbki syntetyczne i są generowane w pamięci w celu łatwego odtworzenia i zrozumienia. Kod został sprawdzony na przykładach w izolowanym środowisku, ale nie gwarantuje to działania wszystkich rzeczywistych plików ani produktu. Przed przystąpieniem do przetwarzania ważnych dokumentów prosimy o zachowanie oryginałów i zapoznanie się z nimi zgodnie z granicami i pozycjami akceptacji w tekście.

Jak rozpoznać tytuły programu Word? Wniosek w jednym zdaniu

Wniosek w jednym zdaniu: użyj paragraph.style jako głównej podstawy do oceniania tytułów i użyj angielskich nazw wewnętrznych lub tabel mapowania, aby znaleźć style. Nie patrz tylko na rozmiar czcionki i pogrubienie.

twoja sytuacjaZalecane praktykipowód
Należy wyodrębnić strukturę rozdziałów z programu WordNaciśnij paragraph.style, aby zidentyfikować tytułEkspresja wizualna nie równa się strukturze, styl jest niezawodną wskazówką semantyczną
Poszukaj wbudowanych stylów w kodzie, a dokument może być w języku chińskim.Użyj angielskich nazw wewnętrznych, takich jak Heading 1, lub utwórz zlokalizowaną tabelę mapowania nazwWbudowane style są przechowywane w formacie XML w języku angielskim, a użycie styles['标题 1'] generuje KeyError
W dokumencie zastosowano style niestandardoweSzukaj bezpośrednio według nazwy styluNiestandardowa nazwa stylu w formacie XML jest zgodna z wyświetlanym interfejsem i nie następuje żadna konwersja lokalizacji.
Style odwołań do akapitów zostały usunięteNajpierw sprawdź, czy obiekt stylu istnieje. Jeśli nie można go rozpoznać, jego wersja zostanie obniżona do zwykłego tekstu.Bezpośredni dostęp do paragraph.style.name może zwrócić None lub zgłosić wyjątek
Akapity są pisane wyłącznie dużą czcionką i pogrubione, w stylu NormalOznaczono jako „tytuł podejrzany"i przesłano do ręcznego potwierdzeniaWybitny wizualnie, ale pozbawiony stylu semantycznego, nie powinien być automatycznie awansowany do węzła strukturalnego

Dlaczego do wyszukiwania stylów musimy używać angielskich nazw wewnętrznych?

python-docx działa na podstawowych plikach WordprocessingML, a nie na interfejsie aplikacji Word. Niezależnie od tego, czy słowo użytkownika jest chińskie, japońskie czy niemieckie, zapisane nazwy wbudowanych stylów są w języku angielskim. Na przykład „Tytuł 1"wyświetlany w chińskiej wersji interfejsu programu Word jest zapisywany w formacie XML jakoHeading 1. Informacje na temat metod przechowywania stylów i zasad nazewnictwa można znaleźć w Zrozumienie stylów — opis koncepcji python-docx.

Jeśli do wyszukiwania w kodzie użyto styles['标题 1'], program bezpośrednio wyrzuci KeyError. Jest to jedna z częstych pułapek podczas pracy z dokumentami wielojęzycznymi.

Style niestandardowe nie podlegają temu ograniczeniu, a ich nazwy w formacie XML są dokładnie takie, jakie widzi użytkownik w interfejsie. Dlatego pisząc solidną logikę analizowania, można zbudować tabelę mapowania ze zlokalizowanych nazw wyświetlanych na angielskie nazwy wewnętrzne lub można wymagać od osób przesyłających dokumenty korzystania ze standardowego szablonu.

Przykład syntezy: poprawne przypadki wyjściowe i brzegowe

Aby zademonstrować logikę rozpoznawania stylu, konstruujemy syntetyczną próbkę zawierającą trzy typowe akapity:

  1. Akapit A: Zastosowano styl Heading 1, a tekst brzmi „Wprowadzenie do rozdziału 1".
  2. Akapit B: Styl toNormal, ale rozmiar czcionki i pogrubienie są ręcznie ustawiane na 16 punktów, a tekst to „Ważne".
  3. Akapit C: Zastosowano niestandardowy stylMyCustomTitle, a tekst brzmi „Opis dodatku".

Oczekiwany wynik: Parser powinien zwrócić uporządkowaną listę zawierającą tylko akapity A i C oznaczone jako węzły tytułowe. Choć akapit B wyróżnia się wizualnie, ze względu na brak stylu semantycznego należy go sklasyfikować jako zwykły tekst lub oznaczyć jako „podejrzany tytuł do ręcznego potwierdzenia"i nie można go automatycznie awansować do węzła strukturalnego.

Błąd i wejście graniczne: Jeśli akapit w dokumencie odnosi się do stylu, który został usunięty, to znaczyw:pStyle w:val="DeletedStyle" istnieje w kodzie XML, ale brakuje definicji stylu, wówczas python-docx uzyskujący dostęp do paragraph.style.name może zwrócić None lub zgłosić wyjątek. Bardziej ostrożnym podejściem jest sprawdzenie, czy obiekt stylu istnieje przed uzyskaniem do niego dostępu, lub obniżenie poziomu takich akapitów do przetwarzania zwykłego tekstu, aby uniknąć przerwania całego procesu analizowania.

Przykład konstrukcji pamięci i kod potwierdzenia stylu

Poniższy kod pokazuje, jak zweryfikować logikę rozpoznawania stylu w kontrolowanym środowisku. Służy do zademonstrowania pomysłów na wykorzystanie interfejsu API i asercji i nie jest analizatorem składniowym klasy produkcyjnej. Kiedy faktycznie go używasz, uruchom go w środowisku, w którym zablokowana jest wersja zależności. Zalecane jest python-docx>=0.8.11. Informacje na temat konkretnego zastosowania stylów można znaleźć w Praca ze stylami — oficjalna dokumentacja Pythona-docx.

from docx import Document
from docx.enum.style import WD_STYLE_TYPE
from docx.shared import Pt

def build_sample_doc():
    """构建含混合样式的合成文档,无需外部文件"""
    doc = Document()
    # 标准内置标题
    doc.add_heading('Chapter One', level=1)
    # 视觉像标题但无样式
    p_visual = doc.add_paragraph('Visual Fake Title')
    run = p_visual.runs[0]
    run.bold = True
    run.font.size = Pt(15)  # 使用Pt单位确保API规范
    # 自定义样式
    if 'MyCustomTitle' not in [s.name for s in doc.styles]:
        doc.styles.add_style('MyCustomTitle', WD_STYLE_TYPE.PARAGRAPH)
    doc.add_paragraph('Appendix Note', style='MyCustomTitle')
    return doc

def extract_semantic_headings(doc):
    """仅提取具有明确样式的标题,忽略直接格式化"""
    headings = []
    for para in doc.paragraphs:
        style_name = para.style.name if para.style else None
        # 严格匹配:内置Heading或已知自定义标题样式
        if style_name and (style_name.startswith('Heading ') or style_name == 'MyCustomTitle'):
            headings.append({'text': para.text, 'style': style_name})
    return headings

# 验证逻辑
sample = build_sample_doc()
result = extract_semantic_headings(sample)

assert len(result) == 2, f"期望2个语义标题,实际得到{len(result)}个"
assert result[0]['style'] == 'Heading 1'
assert result[1]['style'] == 'MyCustomTitle'
assert all('Visual Fake' not in item['text'] for item in result)

Ten kod wyraźnie wyklucza poleganie wyłącznie na atrybutach czcionki w celu ustalenia tytułów. assert służy do potwierdzania, że logika spełnia oczekiwania, ale w prawdziwych dokumentach asercje można zastąpić mechanizmami rejestrowania lub zbierania wyjątków, aby ułatwić ujednolicone przeglądanie problemów podczas przetwarzania wsadowego.

Lista kontrolna akceptacji i granice ręcznego przeglądu

Zautomatyzowane analizowanie nie może objąć wszystkich nawyków związanych ze składem. W poniższej tabeli podsumowano decyzje dotyczące przetwarzania dla typowych scenariuszy, aby pomóc zespołom w wyznaczeniu granic między współpracą maszyn i ludzi.

Obserwuj zjawiskadecyzja o przetwarzaniuCzy wymagane jest ręczne sprawdzenie
Styl akapitu to Heading XWyodrębnij bezpośrednio jako węzeł konstrukcjiNIE
Styl to Normal, ale rozmiar czcionki to ≥14 pkt i jest pogrubionyOznacz jako „podejrzany tytuł"i zachowaj oryginalne informacje o lokalizacjiTak
Nazwa stylu zawiera „tytuł", ale nie jest wbudowana (np. „tytuł rozdziału")Sprawdź tabelę mapowania; w przypadku braku korespondencji uważa się ją za tekst.Pod warunkiem kompletności mapowania
paragraph.style to NoneRejestruj ostrzeżenia i traktuj je jako zwykły tekstTak (w przypadku wyświetlania zbiorczego)
Style niestandardowe dziedziczą po Heading 1Możliwość śledzenia w łańcuchu base_style, uznawana za ważny tytułNie (jeśli łańcuch dziedziczenia jest kompletny)

Należy pamiętać, że ta tabela służy do weryfikacji logiki na poziomie demonstracji kodu, a całościowy efekt należy ocenić na podstawie określonych typów dokumentów. Na przykład „klauzula definiująca"w umowie prawnej może mieć specjalny styl i nie powinna być traktowana jako tytuł sekcji; „Notatka"w podręczniku technicznym może wymagać specjalnego traktowania po przetłumaczeniu, nawet jeśli używaHeading 3. W przypadku napotkania takich reguł specyficznych dla domeny należy uwzględnić proces ręcznego przeglądu.

📊 Porównanie rdzeni

Podstawa wyrokuCzy można go wykorzystać jako węzeł konstrukcyjny?zilustrować
Styl akapitu to Heading XMożna wyodrębnić bezpośrednioSam styl niesie ze sobą semantykę i nie wymaga ręcznego potwierdzenia.
Styl to Normal, tylko duży rozmiar czcionki i pogrubienieBrak automatycznej promocjiOznacz jako podejrzany tytuł i czekam na ręczne potwierdzenie
Style niestandardowe odziedziczone po Heading 1Ważny tytuł jest brany pod uwagę, gdy łańcuch dziedziczenia jest kompletnyMożliwość śledzenia poprzez łańcuch base_style

🎯 Która metoda jest dla Ciebie odpowiednia?

Jeśli chcesz wyodrębnić spis treści lub strukturę rozdziałów z programu Word

Nadaj priorytet używaniu paragraph.style zamiast polegać na rozmiarze czcionki i pogrubieniu.

Jeśli chcesz przetwarzać zlokalizowane wersje dokumentów programu Word, takie jak chińskie i japońskie

Znajdź wbudowane style, używając angielskich nazw wewnętrznych lub utwórz tabelę mapowania zlokalizowanych nazw na nazwy wewnętrzne.

Jeśli Twój dokument jest pisany przez wiele osób i jego format nie jest jednolity

Ręczny przegląd jest zarezerwowany dla akapitów w stylu Normal, ale które są widoczne wizualnie i rejestrowane są informacje o lokalizacji.

Jeśli masz do czynienia z umowami prawnymi lub instrukcjami technicznymi

Najpierw uporządkuj konkretne zasady stylu w terenie, a następnie zdecyduj, które akapity mogą zostać rozpoznane automatycznie, a które wymagają ręcznej oceny.

❓ Często zadawane pytania (FAQ)

1. Dlaczego nie mogę bezpośrednio użyć styles['标题 1'], aby znaleźć tytuł?

Ponieważ python-docx odczytuje bazowy kod XML, wbudowane style są przechowywane w formacie XML jako nazwy angielskie, takie jak Heading 1. „Tytuł 1"wyświetlany w chińskiej wersji interfejsu programu Word spowodujeKeyError, jeśli zostanie użyty w kodzie.

2. Jeśli akapit ma tylko dużą czcionkę i jest pogrubiony, czy można go użyć jako tytułu?

Nie zaleca się automatycznego używania go jako tytułu. Tego typu akapitowi brakuje stylu semantycznego i należy go oznaczyć jako „podejrzany tytuł"i zostanie on ręcznie potwierdzony przed podjęciem decyzji o włączeniu go do struktury.

3. Co zrobić, gdy styl akapitu toNone?

Zaleca się rejestrowanie ostrzeżeń i traktowanie ich jako zwykłego tekstu. Jeśli takie sytuacje występują w dużych ilościach w plikach wsadowych, należy zaplanować ręczny przegląd.

4. Czy jako tytuły można używać niestandardowych stylów?

Jeśli styl niestandardowy dziedziczy po Heading 1, a łańcuch dziedziczenia base_style jest kompletny, można go uznać za prawidłowy tytuł.

📝 Podsumowanie

Oceniając tytuły Worda, główną podstawą powinien być styl, a nie tylko efekty wizualne. Po przejściu weryfikacji kodu nadal należy ją połączyć z określonymi typami dokumentów i ręcznie sprawdzić, aby potwierdzić wiarygodność wyników.

Wypróbuj teraz: prześlij dokument, aby rozpocząć tłumaczenie, zachowując oryginalny układ

Zaktualizowano 2026-11-14