Nedívejte se jen na velikost písma pro nadpisy Wordu: styl je lepší strukturální vodítko
Tento článek přesně řeší základní problémy ve stručném textu o odstavce.style a lokalizovaných názvech a poskytuje jasné hranice vstupu a výstupu, syntetický vzorový kód pro konstrukci paměti, kontrolní seznam pro přijetí a návrhy připojení OmniDoc. Obsah je přirozený a jasný, bez zneužití API nebo nebezpečných operací a všechny technické body jsou podpořeny originální dokumentací.
Pokud použijete skript k dávkové extrakci obsahu nebo kapitol dokumentů aplikace Word, můžete se setkat s vynecháním "nadpisu první úrovně" nebo nesprávným vyhodnocením tučného textu jako kapitoly. Obvykle to není proto, že by regulární výrazy nebyly napsány dostatečně dobře, ale proto, že na odstavec není použit styl nadpisu, jako jeHeading 1, ale velikost písma je ručně zvětšena a text je tučný. Při zpracování struktury dokumentu aplikace Word se vizuální reprezentace nerovná struktuře a paragraph.style je spolehlivější sémantický klíč.
Níže uvedený obsah je vhodný pro vývojáře a dokumentové inženýry odpovědné za automatizaci dokumentů, dávkovou analýzu nebo kontrolu před překladem. Příklady v tomto článku používají syntetické vzorky a jsou generovány v paměti pro snadnou reprodukci a pochopení. Kód byl zkontrolován s příklady v izolovaném prostředí, ale to není zárukou všech skutečných souborů nebo výkonu produktu. Před zpracováním důležitých dokumentů si prosím uschovejte originály a zkontrolujte je podle hranic a přejímacích položek v textu.
Jak identifikovat názvy Wordu? Závěr jednou větou
Závěr jednou větou: Použijte paragraph.style jako hlavní základ pro posuzování titulů a k nalezení stylů použijte anglické interní názvy nebo mapovací tabulky. Nedívejte se jen na velikost písma a tučné písmo.
| vaší situaci | Doporučené postupy | důvod |
|---|---|---|
| Potřebujete extrahovat strukturu kapitol z Wordu | Stisknutím paragraph.style identifikujte titul | Vizuální výraz nerovná se struktura, styl je spolehlivým sémantickým vodítkem |
| Hledejte v kódu vestavěné styly a dokument může být v čínštině. | Použijte anglické interní názvy, například Heading 1, nebo vytvořte tabulku mapování lokalizovaných jmen | Vestavěné styly jsou uloženy v XML jako angličtina, pomocí styles['标题 1'] vyvolá KeyError |
| Dokument používá vlastní styly | Vyhledávejte přímo podle názvu stylu | Název vlastního stylu v XML je konzistentní se zobrazením rozhraní a nedochází k žádné konverzi lokalizace. |
| Styly odkazů na odstavce byly odstraněny | Nejprve zkontrolujte, zda objekt stylu existuje. Pokud jej nelze rozpoznat, bude snížen na prostý text. | Přímý přístup k paragraph.style.name může vrátit None nebo vyvolat výjimku |
Odstavce jsou pouze velkým písmem a tučným písmem se stylem Normal | Označeno jako „podezřelý název"a odesláno k ručnímu potvrzení | Vizuálně vynikající, ale postrádající sémantický styl by neměl být automaticky povýšen na strukturální uzel |
Proč musíme při hledání stylů používat anglické interní názvy?
python-docx pracuje se základními soubory WordprocessingML, nikoli s rozhraním aplikace Word. Bez ohledu na to, zda je slovo uživatele čínština, japonština nebo němčina, uložené názvy vestavěných stylů jsou v angličtině. Například „Titul 1"zobrazený v čínské verzi rozhraní Word je zaznamenán jakoHeading 1 v XML. Metody ukládání stylů a pravidla pojmenování naleznete v Porozumění stylům – popis konceptu python-docx.
Pokud se pro vyhledávání v kódu použije styles['标题 1'], program přímo vyvolá KeyError. To je jedno z běžných úskalí při práci s vícejazyčnými dokumenty.
Vlastní styly nepodléhají tomuto omezení a jejich názvy v XML jsou přesně takové, jaké je uživatel vidí na rozhraní. Proto při psaní robustní logiky analýzy můžete sestavit mapovací tabulku z lokalizovaných zobrazovaných názvů do anglických interních názvů, nebo můžete od odesílatelů dokumentů požadovat, aby používali standardní šablonu.
Příklad syntézy: správný výstup a případy hran
Abychom demonstrovali logiku rozpoznávání stylu, zkonstruujeme syntetický vzorek obsahující tři typické odstavce:
- Odstavec A: Je použit styl
Heading 1a text je "Kapitola 1 Úvod". - Odstavec B: Styl je
Normal, ale velikost písma a tučné písmo jsou ručně nastaveny na 16pt a text je "Důležité." - Odstavec C: Je použit vlastní styl
MyCustomTitlea text je "Popis přílohy".
Očekávaný výstup: Analyzátor by měl vrátit strukturovaný seznam pouze s odstavcem A a odstavcem C označenými jako uzly názvu. Ačkoli je odstavec B vizuálně nápadný, kvůli nedostatku sémantického stylu by měl být klasifikován jako běžný text nebo označen jako „podezřelý název, který má být ručně potvrzen", a nelze jej automaticky povýšit na strukturální uzel.
Chybový a hraniční vstup: Pokud odstavec v dokumentu odkazuje na styl, který byl odstraněn, tj.w:pStyle w:val="DeletedStyle" v XML existuje, ale chybí definice stylu, pak python-docx při přístupu k paragraph.style.name může vrátit None nebo vyvolat výjimku. Obezřetnějším přístupem je zkontrolovat, zda objekt stylu existuje, než k němu přistoupíte, nebo přejít na nižší verzi odstavců na zpracování prostého textu, aby nedošlo k přerušení celého procesu analýzy.
Ukázky konstrukce paměti a kód pro tvrzení stylu
Následující kód ukazuje, jak ověřit logiku rozpoznávání stylů v kontrolovaném prostředí. Používá se k demonstraci využití API a přístupů k aserciím, nikoli produkční parser. Při samotném používání ho prosím spusť v prostředí, kde máte zamčené závislé verze. Doporučuje se python-docx>=0.8.11. Pro konkrétní použití stylů viz Práce se styly – oficiální dokumentace python-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)
Tento kodex výslovně vylučuje posuzování titulů pouze podle atributů písma. assert se používá k potvrzení, že logika splňuje očekávání, ale v reálných dokumentech lze aserce nahradit logováním nebo mechanismy sběru výjimek, což usnadňuje jednotné zobrazení problémů během dávkového zpracování.
Kontrolní seznam přijetí a hranice pro manuální kontrolu
Automatizované parsování nemůže pokrýt všechny typografické zvyklosti. Tabulka níže shrnuje běžná rozhodnutí při řešení scénářů a pomáhá týmům jasně definovat hranice mezi spoluprací strojů a člověka.
| Pozorujte tento jev | Rozhodnutí řešit tuto záležitost | Zda je vyžadováno manuální přezkoumání |
|---|---|---|
Formát odstavce je Heading X | Přímo extrahováno jako strukturální uzel | Ne |
Styl je Normal, ale velikost písma je ≥ 14pt a tučná | Označte jako "Podezřelý titul" a zachovejte původní informace o místě | Ano |
| Názvy stylů zahrnují "název", ale nejsou vloženy (např. "název sekce") | Podívej se na mapovou tabulku; Pokud neexistuje korespondence, je považován za hlavní text | Záleží na integritě mapování |
paragraph.style je None | Nahrávejte varování a zpracováváte je jako prostý text | Ano (při hromadném vydání) |
Vlastní styly převzaté z Heading 1 | Lze jej vysledovat zpětně přes řetězec base_style a je považován za platný titul | Ne (pokud je dědičný řetězec úplný) |
Upozorňujeme, že tato tabulka slouží k logické validaci na úrovni demonstrace kódu a celkový efekt by měl být hodnocen na základě konkrétních typů dokumentů. Například "definicní klauzule" v právních smlouvách mohou používat vyhrazený styl a neměly by být považovány za názvy kapitol; "Poznámky" v technické příručce mohou vyžadovat zvláštní manipulaci při překladu i při použití Heading 3. Při setkání s konkrétními pravidly v těchto oblastech by měla být přidána ruční kontrola.
📊 Srovnání jádra
| Základ pro rozsudek | Může sloužit jako strukturální uzel? | Vysvětlení |
|---|---|---|
Formát odstavce je Heading X | Můžete ho získat přímo | Samotný styl nese sémantiku a nevyžaduje ruční potvrzení |
Styl je Normal, pouze ve velkém písmu a tučně | Žádné automatické zvedání | Označ jako podezřelý titul, čeká na ruční potvrzení |
Vlastní styly převzaté z Heading 1 | Kompletní dědický řetězec je považován za platný titul | Sledovatelnost je možná přes řetězec base_style |
🎯 Která metoda ti vyhovuje?
Pokud potřebujete extrahovat obsah nebo strukturu kapitol z Wordu
Upřednostňujte použití paragraph.style pro posouzení; nespoléhejte se na velikost písma nebo tučnost.
Pokud pracujete s lokalizovanými verzemi Word dokumentů v čínštině, japonštině nebo jiných jazycích
Použijte anglický interní název pro nalezení vestavěných stylů, nebo vytvořte mapovací tabulku z lokalizovaného názvu na interní název.
Pokud je váš dokument napsán více lidmi a má nekonzistentní formáty
U odstavců stylizovaných Normal, ale vizuálně výrazných, se zachovává ruční kontrola a zaznamenávají informace o lokalitě.
Pokud řešíte právní smlouvy nebo technické manuály
Nejprve si vyjasněte konkrétní stylová pravidla v oboru, poté rozhodněte, které odstavce lze automaticky rozpoznat a které vyžadují ruční posouzení.
❓ Často kladené otázky (FAQ)
1. Proč prostě nemůžete použít styles['标题 1'] k hledání titulů?
Protože python-docx čte základní XML, vestavěné styly jsou uloženy jako anglické názvy v XML, například Heading 1. Čínská verze rozhraní Wordu zobrazuje "Title 1" v kódu, což způsobuje KeyError.
2. Odstavce mají pouze velké písmo a jsou tučně; lze je použít jako názvy?
Nedoporučuje se automaticky jej používat jako název. Takové odstavce postrádají sémantický styl a měly by být označeny jako "podezřelé názvy", a teprve po ručním potvrzení by měly být zahrnuty do struktury.
3. Jak zacházet se styly odstavců jako None?
Doporučuje se varování zaznamenávat a zpracovávat je jako prostý text. Pokud se takové situace vyskytují často v hromadných dokumentech, je třeba zajistit ruční kontrolu.
4. Lze použít vlastní styly jako tituly?
Pokud vlastní styl dědí z Heading 1 a dědičný řetězec base_style je kompletní, lze jej považovat za platný titul.
📝 Shrnutí
Při posuzování názvů ve Wordu by měl být hlavním kritériem styl, nikoli jen vizuální efekt. Po úspěšném ověření kódu je stále nutné ověřit spolehlivost výsledků zvážením konkrétního typu dokumentu a ruční kontrolou.
Zkušenost nyní: Nahrajte svůj dokument a začněte s překladem, přičemž zachováte původní formátování


