document/docx.go

73 lines
1.5 KiB
Go
Raw Normal View History

package document
import (
"fmt"
"io"
"apigo.cc/go/cast"
"apigo.cc/go/file"
"github.com/young2j/oxmltotext/docxtotext"
)
// Docx 封装了 Word 文档的读取与识别。
type Docx struct {
filename string
Content string
Metadata map[string]any
}
// OpenDocx 打开一个 Word 文档 (.docx)。
func OpenDocx(filename string) (*Docx, error) {
if !file.Exists(filename) {
return nil, fmt.Errorf("file not found: %s", filename)
}
d := &Docx{
filename: filename,
Metadata: make(map[string]any),
}
dp, err := docxtotext.Open(filename)
if err == nil {
defer dp.Close()
d.Content, _ = dp.ExtractTexts()
}
return d, nil
}
// ToJSON 返回包含元数据和内容的 JSON 字符串。
func (d *Docx) ToJSON() string {
res, _ := cast.ToJSON(map[string]any{
"metadata": d.Metadata,
"content": d.Content,
})
return res
}
// ToMarkdown 返回 Markdown 格式的内容。
func (d *Docx) ToMarkdown() string {
return d.Content
}
// Save 保存文档。目前主要支持保存提取后的文本。
func (d *Docx) Save(filename ...string) error {
path := d.filename
if len(filename) > 0 && filename[0] != "" {
path = filename[0]
}
// 如果是原格式保存,目前仅作为文本保存或保持原样
// 复杂的 Docx 写入暂未集成
return file.Write(path, d.Content)
}
// ReadText 从 io.Reader 中读取并提取 Word 文本。
2026-05-12 12:36:41 +08:00
func (d *Docx) ReadText(r io.ReaderAt, size int64) (string, error) {
dp, err := docxtotext.OpenReader(r, size)
if err != nil {
return "", err
}
2026-05-12 12:36:41 +08:00
defer dp.Close()
return dp.ExtractTexts()
}