document/docx.go

48 lines
889 B
Go
Raw Normal View History

package office
import (
"bytes"
"io"
"apigo.cc/go/file"
"github.com/young2j/oxmltotext/docxtotext"
)
// Docx 封装了 Word 文档的读取操作。
type Docx struct {
filename string
}
// OpenDocx 打开一个 Word 文档 (.docx)。
func OpenDocx(filename string) (*Docx, error) {
if !file.Exists(filename) {
return nil, file.ErrNotExist
}
return &Docx{filename: filename}, nil
}
// Text 提取文档中的所有文本。
func (d *Docx) Text() (string, error) {
f, err := file.Open(d.filename)
if err != nil {
return "", err
}
defer f.Close()
return d.ReadText(f)
}
// ReadText 从 io.Reader 中读取并提取 Word 文本。
func (d *Docx) ReadText(r io.Reader) (string, error) {
data, err := io.ReadAll(r)
if err != nil {
return "", err
}
res, err := docxtotext.Extract(bytes.NewReader(data), nil)
if err != nil {
return "", err
}
return res, nil
}