Files
file-tool-wails/services/pdf_service.go
2026-06-17 08:05:20 +08:00

147 lines
3.2 KiB
Go

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
}