package common import ( "archive/zip" "io" "strings" ) type docxParser struct{} // Parse docx:解 zip 读 word/document.xml,按 段落提取文本 func (p *docxParser) Parse(path string) (string, error) { r, err := zip.OpenReader(path) if err != nil { return "", err } defer r.Close() var sb strings.Builder for _, f := range r.File { if f.Name != "word/document.xml" { continue } rc, err := f.Open() if err != nil { return "", err } body, err := io.ReadAll(rc) rc.Close() if err != nil { return "", err } extractDocxText(string(body), &sb) return sb.String(), nil } return "", nil } // extractDocxText 解析 document.xml:每个 一段,段内文本去 XML 标签 func extractDocxText(xml string, sb *strings.Builder) { for { start := strings.Index(xml, "") { continue } value := seg[1:] if j := strings.Index(value, ""); j >= 0 { value = value[:j] } paraSb.WriteString(value) } line := strings.TrimSpace(paraSb.String()) if line != "" { sb.WriteString(line) sb.WriteString("\n") } } } // findTagEnd 找到 对应的 结束位置(返回开标签之后的位置) func findTagEnd(xml string, start int) int { openEnd := strings.Index(xml[start:], ">") if openEnd < 0 { return -1 } closeTag := strings.Index(xml[start:], "") if closeTag < 0 { return -1 } return start + closeTag + len("") }