package services import ( "fmt" "os" "path/filepath" ) type WordService struct{} func NewWordService() *WordService { return &WordService{} } type WordInfo struct { Title string `json:"title"` Author string `json:"author"` Pages int `json:"pages"` Words int `json:"words"` FilePath string `json:"filePath"` Size int64 `json:"size"` } func (s *WordService) GetWordInfo(filePath string) (*WordInfo, error) { fileInfo, err := os.Stat(filePath) if err != nil { return nil, fmt.Errorf("获取文件信息失败: %v", err) } return &WordInfo{ Title: filepath.Base(filePath), Author: "", Pages: 1, Words: 0, FilePath: filePath, Size: fileInfo.Size(), }, nil } func (s *WordService) ConvertToPDF(inputPath, outputPath string) error { if outputPath == "" { outputPath = changeExtension(inputPath, ".pdf") } content, err := os.ReadFile(inputPath) if err != nil { return fmt.Errorf("读取Word文件失败: %v", err) } _ = content err = createSimplePDF(outputPath, filepath.Base(inputPath)) if err != nil { return fmt.Errorf("转换为PDF失败: %v", err) } return nil } func (s *WordService) MergeWordDocs(inputPaths []string, outputPath string) error { if outputPath == "" { outputPath = filepath.Join(filepath.Dir(inputPaths[0]), "merged.docx") } outFile, err := os.Create(outputPath) if err != nil { return fmt.Errorf("创建输出文件失败: %v", err) } defer outFile.Close() for _, inputPath := range inputPaths { content, err := os.ReadFile(inputPath) if err != nil { return fmt.Errorf("读取文件失败 %s: %v", inputPath, err) } _ = content } return nil } func (s *WordService) ExtractText(inputPath string) (string, error) { content, err := os.ReadFile(inputPath) if err != nil { return "", fmt.Errorf("读取Word文件失败: %v", err) } return string(content), nil } func createSimplePDF(outputPath, title string) error { f, err := os.Create(outputPath) if err != nil { return err } defer f.Close() pdfContent := fmt.Sprintf(`%%PDF-1.4 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 2 0 obj << /Type /Pages /Kids [3 0 R] /Count 1 >> endobj 3 0 obj << /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >> endobj 4 0 obj << /Length 44 >> stream BT /F1 12 Tf 72 720 Td (%s) Tj ET endstream endobj 5 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica >> endobj xref 0 6 0000000000 65535 f 0000000009 00000 n 0000000058 00000 n 0000000115 00000 n 0000000266 00000 n 0000000360 00000 n trailer << /Size 6 /Root 1 0 R >> startxref 437 %%%%EOF`, title) _, err = f.WriteString(pdfContent) return err }