147 lines
3.2 KiB
Go
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
|
|
}
|