如何使用python-docx获取项目符号列表的缩进量?
Word文档提取带缩进字符串的问题解决
问题
使用python-docx提取Word文本时,left_indent和first_line_indent仅对无项目符号的普通文本生效,带项目符号的段落缩进无法获取,目标是生成带正确缩进的字符串。
原代码
import docx def getText(filename): doc = docx.Document(filename) fullText = [] for paragraph in doc.paragraphs: indent = '' if paragraph.paragraph_format.left_indent: indent = ' ' * int(round(paragraph.paragraph_format.left_indent / 100000)) fullText.append(indent + paragraph.text) return '\n'.join(fullText) print(getText(r"file.docx"))
问题原因
带项目符号的段落,其缩进规则由列表样式/列表级别定义,而非段落自身的left_indent属性,所以直接读取段落缩进无法获取正确值。
解决代码
import docx def getText(filename): doc = docx.Document(filename) fullText = [] for paragraph in doc.paragraphs: indent = '' # 处理列表段落:通过列表级别确定缩进 if paragraph.list_format.is_list: level = paragraph.list_format.level_index # 每个列表级别用4个空格模拟缩进,可根据需求调整 indent = ' ' * (level + 1) else: # 处理普通段落:转换left_indent为空格 if paragraph.paragraph_format.left_indent: # EMU转空格近似值:1个空格≈6磅,1磅=20缇,1缇=635EMU indent_count = int(round(paragraph.paragraph_format.left_indent / (6 * 20 * 635))) indent = ' ' * indent_count fullText.append(indent + paragraph.text) return '\n'.join(fullText) print(getText(r"file.docx"))
说明
- 列表段落通过
paragraph.list_format.is_list判断,level_index获取当前列表级别(从0开始),用空格数模拟层级缩进; - 普通段落的
left_indent单位是EMU,通过转换公式近似计算对应空格数,可根据实际显示效果调整转换比例; - 该方案兼顾普通段落和列表段落的缩进提取,满足简单提取带格式字符串的需求。
内容的提问来源于stack exchange,提问作者Zigatronz
相关产品推荐
相关产品推荐

