package ppt import ( "archive/zip" "bytes" _ "embed" "fmt" "io" "strings" ) // Office Open XML (OOXML) http://officeopenxml.com/prPresentation.php //go:embed template.pptx var pptx_template []byte func copyPptxTemplateTo(w *zip.Writer) error { reader := bytes.NewReader(pptx_template) zipReader, err := zip.NewReader(reader, reader.Size()) if err != nil { fmt.Printf("%v", err) } for _, f := range zipReader.File { fw, err := w.Create(f.Name) if err != nil { return err } fr, err := f.Open() if err != nil { return err } _, err = io.Copy(fw, fr) if err != nil { return err } } return nil } func addFile(zipFile *zip.Writer, filePath, content string) error { w, err := zipFile.Create(filePath) if err != nil { return err } w.Write([]byte(content)) return nil } // https://startbigthinksmall.wordpress.com/2010/01/04/points-inches-and-emus-measuring-units-in-office-open-xml/ const SLIDE_WIDTH = 9144000 const SLIDE_HEIGHT = 5143500 const RELS_SLIDE_XML = `` func getRelsSlideXml(imageId string) string { return fmt.Sprintf(RELS_SLIDE_XML, imageId, imageId) } const SLIDE_XML = `` func getSlideXml(imageId, imageName string, top, left, width, height int) string { return fmt.Sprintf(SLIDE_XML, imageName, imageName, imageId, left, top, width, height) } func getPresentationXmlRels(slideFileNames []string) string { var builder strings.Builder builder.WriteString(``) for _, name := range slideFileNames { builder.WriteString(fmt.Sprintf( ``, name, name, )) } builder.WriteString("") return builder.String() } func getContentTypesXml(slideFileNames []string) string { var builder strings.Builder builder.WriteString(``) for _, name := range slideFileNames { builder.WriteString(fmt.Sprintf( ``, name, )) } builder.WriteString(``) return builder.String() } func getPresentationXml(slideFileNames []string) string { var builder strings.Builder builder.WriteString(``) builder.WriteString("") for i, name := range slideFileNames { builder.WriteString(fmt.Sprintf(``, i, name)) } builder.WriteString("") builder.WriteString(fmt.Sprintf( ``, SLIDE_WIDTH, SLIDE_HEIGHT, )) return builder.String() }