package pkg import ( "encoding/json" "fmt" "os" "os/exec" "path/filepath" "strings" ) // 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 } // CopyImageToDoc 将图片插入到word头部 func CopyImageToDoc(docPath, imgPath string) error { baseDir, err := os.Getwd() if err != nil { return fmt.Errorf("获取工作目录失败: %w", err) } exePath := filepath.Join(baseDir, "plugins", "insert_img_to_word.exe") // 检查exe是否存在 if _, err = os.Stat(exePath); os.IsNotExist(err) { return fmt.Errorf("exe不存在: %s", exePath) } // 检查docx文件是否存在 if _, err = os.Stat(docPath); os.IsNotExist(err) { return fmt.Errorf("文件不存在: %s", docPath) } // 检查图片文件是否存在 if _, err = os.Stat(imgPath); os.IsNotExist(err) { return fmt.Errorf("图片不存在: %s", imgPath) } cmd := exec.Command(exePath, docPath, imgPath) output, err := cmd.CombinedOutput() if err != nil { return fmt.Errorf("执行失败: %v", err) } 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("解析结果失败: %v, 输出: %s", err, string(output)) } if !result.Success { return fmt.Errorf("插入图片失败: %s", result.Error) } return nil } // Md2wordFix 将 Markdown 文件转换为 Word 文档,并支持插入图片 // 参数: // - mdFile: Markdown 文件路径 // - outputDir: 输出目录路径 // - img: 图片路径列表(按顺序插入到 ## 标题之间,跳过第一个) // // 返回: // - error: 错误信息,成功返回 func Md2wordFix(mdFile, outPutDIr string, img []string) (string, error) { baseDir, err := os.Getwd() if err != nil { return "", fmt.Errorf("获取工作目录失败: %w", err) } exePath := filepath.Join(baseDir, "plugins", "md2word_fix.exe") // 3. 检查 exe 是否存在 if _, err = os.Stat(exePath); os.IsNotExist(err) { return "", fmt.Errorf("exe不存在: %s", exePath) } // 4. 检查 Markdown 文件是否存在 if _, err = os.Stat(mdFile); os.IsNotExist(err) { return "", fmt.Errorf("Markdown文件不存在: %s", mdFile) } // 5. 确保输出目录存在 if err = os.MkdirAll(outPutDIr, 0755); err != nil { return "", fmt.Errorf("创建输出目录失败: %w", err) } //7. 构建命令行参数 args := []string{"-i", mdFile, "-o", outPutDIr} // 如果有图片,添加图片参数 if len(img) > 0 { // 过滤空图片路径 validImages := make([]string, 0) for _, img := range img { if strings.TrimSpace(img) != "" { validImages = append(validImages, img) } } if len(validImages) > 0 { imagesArg := strings.Join(validImages, ",") args = append(args, "--images", imagesArg) } } cmd := exec.Command(exePath, args...) output, err := cmd.CombinedOutput() if err != nil { return "", fmt.Errorf("执行失败: %v", err) } 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("解析结果失败: %v, 输出: %s", err, string(output)) } if !result.Success { return "", fmt.Errorf("插入图片失败: %s", result.Error) } return result.Content, nil } func JsonRepair(badJson string) (string, error) { baseDir, err := os.Getwd() if err != nil { return "", fmt.Errorf("获取工作目录失败: %w", err) } exePath := filepath.Join(baseDir, "plugins", "json_fix.exe") // 3. 检查 exe 是否存在 if _, err = os.Stat(exePath); os.IsNotExist(err) { return "", fmt.Errorf("exe不存在: %s", exePath) } //7. 构建命令行参数 args := []string{"-j", badJson} cmd := exec.Command(exePath, args...) output, err := cmd.CombinedOutput() if err != nil { return "", fmt.Errorf("执行失败: %v", err) } 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("解析结果失败: %v, 输出: %s", err, string(output)) } if !result.Success { return "", fmt.Errorf("转换失败: %s", result.Error) } return result.Content, nil }