You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取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环境:

  1. 转PDF命令(需提前安装LibreOffice):
    libreoffice --headless --convert-to pdf cg0002.docx
  2. 提取代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 06:15:03