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 sytuacja | Zalecane praktyki | powód |
|---|---|---|
| Należy wyodrębnić strukturę rozdziałów z programu Word | Naciś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 nazw | Wbudowane style są przechowywane w formacie XML w języku angielskim, a użycie styles['标题 1'] generuje KeyError |
| W dokumencie zastosowano style niestandardowe | Szukaj bezpośrednio według nazwy stylu | Niestandardowa 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ęte | Najpierw 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 Normal | Oznaczono jako „tytuł podejrzany"i przesłano do ręcznego potwierdzenia | Wybitny 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:
- Akapit A: Zastosowano styl
Heading 1, a tekst brzmi „Wprowadzenie do rozdziału 1". - Akapit B: Styl to
Normal, ale rozmiar czcionki i pogrubienie są ręcznie ustawiane na 16 punktów, a tekst to „Ważne". - Akapit C: Zastosowano niestandardowy styl
MyCustomTitle, 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 zjawiska | decyzja o przetwarzaniu | Czy wymagane jest ręczne sprawdzenie |
|---|---|---|
Styl akapitu to Heading X | Wyodrębnij bezpośrednio jako węzeł konstrukcji | NIE |
Styl to Normal, ale rozmiar czcionki to ≥14 pkt i jest pogrubiony | Oznacz jako „podejrzany tytuł"i zachowaj oryginalne informacje o lokalizacji | Tak |
| 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 None | Rejestruj ostrzeżenia i traktuj je jako zwykły tekst | Tak (w przypadku wyświetlania zbiorczego) |
Style niestandardowe dziedziczą po Heading 1 | Moż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 wyroku | Czy można go wykorzystać jako węzeł konstrukcyjny? | zilustrować |
|---|---|---|
Styl akapitu to Heading X | Można wyodrębnić bezpośrednio | Sam styl niesie ze sobą semantykę i nie wymaga ręcznego potwierdzenia. |
Styl to Normal, tylko duży rozmiar czcionki i pogrubienie | Brak automatycznej promocji | Oznacz jako podejrzany tytuł i czekam na ręczne potwierdzenie |
Style niestandardowe odziedziczone po Heading 1 | Ważny tytuł jest brany pod uwagę, gdy łańcuch dziedziczenia jest kompletny | Moż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


