package models import ( "fmt" "os/exec" "strings" ) type PrintOption string const ( CoverPage PrintOption = "-o FrontCoverPage=Printed -o FrontCoverTray=BypassTray" Colored PrintOption = "-o SelectColor=Color" Grayscale PrintOption = "-o SelectColor=Grayscale" LongEdge PrintOption = "" ShortEdge PrintOption = "-o Binding=TopBinding" CreateBooklet PrintOption = "-o Combination=Booklet -o PageSize=A5" ) type PrintJob struct { Pdf string Amount uint Options []PrintOption } func GetPrintMode(mode string) PrintOption { if mode == "LongEdge" { return LongEdge } if mode == "ShortEdge" { return ShortEdge } return CreateBooklet } func NewPrintJob(shopItem ShopItem, variant ItemVariant, coverPage bool, amount uint) (PrintJob, error) { if shopItem.Pdf == "" { return PrintJob{}, fmt.Errorf("ShopItem has no PDF assigned") } if amount > 100 { return PrintJob{}, fmt.Errorf("Amount to big. This is denied for security reasons") } var result PrintJob result.Pdf = shopItem.Pdf result.Amount = amount if variant.Name == "Colored" { result.Options = append(result.Options, Colored) } if coverPage { result.Options = append(result.Options, CoverPage) } result.Options = append(result.Options, GetPrintMode(shopItem.PrintMode)) return result, nil } func (p *PrintJob) Execute() error { baseCommand := "lp -d KONICA_MINOLTA_KONICA_MINOLTA_bizhub_C258/BookletPrint" baseCommand += fmt.Sprintf(" -n %v ", p.Amount) for _, option := range p.Options { baseCommand += fmt.Sprintf(" %v ", option) } baseCommand += fmt.Sprintf(" -- %s", p.Pdf) parts := strings.Fields(baseCommand) // The first part is the command, the rest are the arguments fmt.Println(parts) cmd := exec.Command(parts[0], parts[1:]...) output, err := cmd.CombinedOutput() if err != nil { fmt.Printf("Error: %s\n", err) return err } fmt.Printf("Output:\n%s\n", output) return nil }