181 lines
4.6 KiB
Go
181 lines
4.6 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) (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
|
|
}
|