如何提取docx文件的文本及字体、字号、颜色等格式信息?
解决方案
方案1:Python 补充python-docx的样式继承逻辑
python-docx返回属性为None的核心原因是多数格式属性没有在run层级显式声明,而是继承自段落样式、文档默认样式,只需补充逐层查找逻辑即可:
import docx def get_effective_font_attr(run, attr_name): # 优先读取run自身显式设置的属性 val = getattr(run.font, attr_name) if val is not None: return val # 读取run所属字符样式的属性 if run.style is not None: val = getattr(run.style.font, attr_name) if val is not None: return val # 读取所属段落样式的属性 para = run._parent if para.style is not None: val = getattr(para.style.font, attr_name) if val is not None: return val # 最终读取文档默认样式属性 default_font = run.part.document.styles['Normal'].font return getattr(default_font, attr_name) doc = docx.Document('cg0002.docx') for para in doc.paragraphs: for run in para.runs: text = run.text is_bold = get_effective_font_attr(run, 'bold') is_italic = get_effective_font_attr(run, 'italic') font_size = get_effective_font_attr(run, 'size') font_name = get_effective_font_attr(run, 'name') font_color = run.font.color.rgb if run.font.color.type is not None else None print(f"文本:{text},加粗:{is_bold},斜体:{is_italic},字号:{font_size},字体:{font_name},颜色:{font_color}")
方案2:Windows平台PowerShell调用Word COM接口(格式解析100%准确)
直接调用Word原生引擎解析文档,不存在格式丢失问题,适合Windows环境使用:
$word = New-Object -ComObject Word.Application $word.Visible = $false $doc = $word.Documents.Open("C:\完整路径\cg0002.docx") foreach ($para in $doc.Paragraphs) { foreach ($run in $para.Range.Words) { $text = $run.Text.Trim() if ($text -eq "") { continue } $is_bold = $run.Bold $is_italic = $run.Italic $font_size = $run.Font.Size $font_name = $run.Font.Name $font_color = $run.Font.Color Write-Host "文本:$text,加粗:$is_bold,斜体:$is_italic,字号:$font_size,字体:$font_name,颜色:$font_color" } } $doc.Close() $word.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null
方案3:跨平台转PDF后提取
先通过LibreOffice命令行将docx无损转换为PDF,再用PyMuPDF提取带格式的文本,适合非Windows环境:
- 转PDF命令(需提前安装LibreOffice):
libreoffice --headless --convert-to pdf cg0002.docx - 提取代码:
import fitz # 安装命令:pip install pymupdf doc = fitz.open("cg0002.pdf") for page in doc: blocks = page.get_text("dict")["blocks"] for block in blocks: if block["type"] == 0: # 仅处理文本块 for line in block["lines"]: for span in line["spans"]: text = span["text"] font_name = span["font"] font_size = span["size"] is_bold = "Bold" in font_name is_italic = "Italic" in font_name color = span["color"] print(f"文本:{text},加粗:{is_bold},斜体:{is_italic},字号:{font_size},字体:{font_name},颜色:{hex(color)}")
方案4:Java用Apache POI XWPF模块
Apache POI对docx样式继承逻辑的支持更完善,默认可直接读取计算后的最终属性:
import org.apache.poi.xwpf.usermodel.*; import java.io.FileInputStream; public class DocxReader { public static void main(String[] args) throws Exception { XWPFDocument doc = new XWPFDocument(new FileInputStream("cg0002.docx")); for (XWPFParagraph para : doc.getParagraphs()) { for (XWPFRun run : para.getRuns()) { String text = run.getText(0); boolean isBold = run.isBold(); boolean isItalic = run.isItalic(); int fontSize = run.getFontSize(); String fontName = run.getFontName(); String color = run.getColor(); System.out.printf("文本:%s,加粗:%b,斜体:%b,字号:%d,字体:%s,颜色:%s%n", text, isBold, isItalic, fontSize, fontName, color); } } doc.close(); } }
内容的提问来源于stack exchange,提问作者Yeshwanth
相关产品推荐
相关产品推荐

