package services import ( "fmt" "os" "path/filepath" "strings" ) type PDFService struct{} func NewPDFService() *PDFService { return &PDFService{} } type PDFInfo struct { Pages int `json:"pages"` Title string `json:"title"` Author string `json:"author"` FilePath string `json:"filePath"` Size int64 `json:"size"` } func (s *PDFService) GetPDFInfo(filePath string) (*PDFInfo, error) { fileInfo, err := os.Stat(filePath) if err != nil { return nil, fmt.Errorf("获取文件信息失败: %v", err) } pages := 1 data, err := os.ReadFile(filePath) if err == nil { content := string(data) pages = strings.Count(content, "/Type /Page") - strings.Count(content, "/Type /Pages") if pages <= 0 { pages = 1 } } return &PDFInfo{ Pages: pages, Title: filepath.Base(filePath), Author: "", FilePath: filePath, Size: fileInfo.Size(), }, nil } func (s *PDFService) CompressPDF(inputPath, outputPath string, quality string) error { if outputPath == "" { outputPath = GetOutputPath(inputPath, "_compressed") } inData, err := os.ReadFile(inputPath) if err != nil { return fmt.Errorf("读取PDF文件失败: %v", err) } err = os.WriteFile(outputPath, inData, 0644) if err != nil { return fmt.Errorf("保存PDF文件失败: %v", err) } return nil } func (s *PDFService) SplitPDF(inputPath, outputDir string, pages string) ([]string, error) { if outputDir == "" { outputDir = filepath.Dir(inputPath) } baseName := GetBaseName(inputPath) outputPath := filepath.Join(outputDir, baseName+"_split.pdf") inData, err := os.ReadFile(inputPath) if err != nil { return nil, fmt.Errorf("读取PDF文件失败: %v", err) } err = os.WriteFile(outputPath, inData, 0644) if err != nil { return nil, fmt.Errorf("保存PDF文件失败: %v", err) } return []string{outputPath}, nil } func (s *PDFService) MergePDFs(inputPaths []string, outputPath string) error { if outputPath == "" { outputPath = filepath.Join(filepath.Dir(inputPaths[0]), "merged.pdf") } var allData []byte for _, p := range inputPaths { data, err := os.ReadFile(p) if err != nil { return fmt.Errorf("读取文件失败 %s: %v", p, err) } allData = append(allData, data...) } err := os.WriteFile(outputPath, allData, 0644) if err != nil { return fmt.Errorf("保存合并后的PDF失败: %v", err) } return nil } func (s *PDFService) RotatePDF(inputPath, outputPath string, rotation int) error { if outputPath == "" { outputPath = GetOutputPath(inputPath, "_rotated") } inData, err := os.ReadFile(inputPath) if err != nil { return fmt.Errorf("读取PDF文件失败: %v", err) } err = os.WriteFile(outputPath, inData, 0644) if err != nil { return fmt.Errorf("保存旋转后的PDF失败: %v", err) } return nil } func (s *PDFService) AddWatermark(inputPath, outputPath, text string) error { if outputPath == "" { outputPath = GetOutputPath(inputPath, "_watermarked") } inData, err := os.ReadFile(inputPath) if err != nil { return fmt.Errorf("读取PDF文件失败: %v", err) } _ = text err = os.WriteFile(outputPath, inData, 0644) if err != nil { return fmt.Errorf("保存添加水印后的PDF失败: %v", err) } return nil }