138 lines
2.6 KiB
Go
138 lines
2.6 KiB
Go
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
|
|
}
|