geoGo/pkg/doc.go

60 lines
1.4 KiB
Go

package pkg
import (
"encoding/json"
"fmt"
"os"
"os/exec"
"path/filepath"
)
// ExtractWordContent 从docx文件提取内容
func ExtractWordContent(filePath, format string) (string, error) {
// 获取exe路径
baseDir, err := os.Getwd()
if err != nil {
return "", fmt.Errorf("获取工作目录失败: %w", err)
}
exePath := filepath.Join(baseDir, "plugins", "docx_extractor.exe")
// 检查exe是否存在
if _, err := os.Stat(exePath); os.IsNotExist(err) {
return "", fmt.Errorf("exe不存在: %s", exePath)
}
// 检查docx文件是否存在
if _, err := os.Stat(filePath); os.IsNotExist(err) {
return "", fmt.Errorf("文件不存在: %s", filePath)
}
// 正确调用方式:使用 --format 参数
cmd := exec.Command(exePath, filePath, "--format", format, "--json")
output, err := cmd.Output()
if err != nil {
// 获取错误输出
if exitErr, ok := err.(*exec.ExitError); ok {
return "", fmt.Errorf("执行失败: %w, stderr: %s", err, string(exitErr.Stderr))
}
return "", fmt.Errorf("执行失败: %w", err)
}
// 解析JSON
var result struct {
Success bool `json:"success"`
Content string `json:"content"`
Error string `json:"error"`
}
if err := json.Unmarshal(output, &result); err != nil {
return "", fmt.Errorf("解析结果失败: %w, output: %s", err, string(output))
}
if !result.Success {
return "", fmt.Errorf("提取失败: %s", result.Error)
}
return result.Content, nil
}