geoGo/pkg/plugin.go

181 lines
4.5 KiB
Go

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) 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 nil
}