package main import ( "fmt" "io/ioutil" "log" "os" "path/filepath" "strings" "gioui.org/app" "gioui.org/font/gofont" "gioui.org/layout" "gioui.org/op" "gioui.org/text" "gioui.org/unit" "gioui.org/widget" "gioui.org/widget/material" "github.com/unidoc/unioffice/common/license" "github.com/unidoc/unioffice/document" ) func init() { // Make sure to load your metered License API key prior to using the library. // If you need a key, you can sign up and create a free one at https://cloud.unidoc.io err := license.SetMeteredKey(os.Getenv(`UNIDOC_LICENSE_API_KEY`)) if err != nil { panic(err) } } func main() { go func() { w := new(app.Window) w.Option(app.Title("Fusionner DOCX"), app.Size(unit.Dp(800), unit.Dp(600))) if err := loop(w); err != nil { log.Fatal(err) } os.Exit(0) }() app.Main() } func loop(w *app.Window) error { var ops op.Ops th := material.NewTheme() th.Shaper = text.NewShaper(text.WithCollection(gofont.Collection())) var input widget.Editor input.SingleLine = true var button widget.Clickable for { evt := w.Event() switch e := evt.(type) { case app.DestroyEvent: return e.Err case app.FrameEvent: gtx := app.NewContext(&ops, e) layout.Flex{ Axis: layout.Vertical, Alignment: layout.Middle, }.Layout(gtx, layout.Rigid(material.H1(th, "Sélectionner un dossier").Layout), layout.Rigid(material.Editor(th, &input, "Chemin du dossier").Layout), layout.Rigid(func(gtx layout.Context) layout.Dimensions { btn := material.Button(th, &button, "Fusionner") btn.TextSize = unit.Sp(20) for button.Clicked(gtx) { dossier := strings.TrimSpace(input.Text()) if dossier != "" { fusionnerDocx(dossier) } else { fmt.Println("Le chemin du dossier est vide") } } return btn.Layout(gtx) }), ) e.Frame(&ops) } } } func fusionnerDocx(dossier string) { docFusionne := document.New() fichiers, err := ioutil.ReadDir(dossier) if err != nil { log.Fatalf("Erreur lors de la lecture du dossier : %v", err) } for _, fichier := range fichiers { if filepath.Ext(fichier.Name()) == ".docx" { cheminFichier := filepath.Join(dossier, fichier.Name()) doc, err := document.Open(cheminFichier) if err != nil { log.Printf("Erreur lors de l'ouverture du fichier %s : %v", fichier.Name(), err) continue } for _, para := range doc.Paragraphs() { newPara := docFusionne.AddParagraph() // newPara.Properties().SetAlignment(para.Properties().Alignment()) for _, run := range para.Runs() { newRun := newPara.AddRun() newRun.Properties().SetBold(run.Properties().IsBold()) newRun.Properties().SetItalic(run.Properties().IsItalic()) // newRun.Properties().SetUnderline(run.Properties().IsUnderline()) newRun.AddText(run.Text()) } } doc.Close() } } nomFichierSortie := "fusion.doc" err = docFusionne.SaveToFile(nomFichierSortie) if err != nil { log.Fatalf("Erreur lors de l'enregistrement du document fusionné : %v", err) } fmt.Printf("Documents fusionnés dans %s\n", nomFichierSortie) }