何千ものdoc/xlsファイルをバッチ変換するプログラムをgolangで作成しました。
- 変換するドキュメントのパスに「root」変数値を定義します
- すでにpdfに変換されたドキュメントはスキップされます(そうでない場合は、visit()関数でチェック条件をコメントしてください)
- ここでは4つのスレッドを使用しています(4コアのIntel i3を使用しています)。main()関数で値を変更できます
Libreofficeが一部のファイルを変換しない場合があるため、ファイルを開いて手動でPDFに変換する必要があります。幸いなことに、変換するのは私の16.000ドキュメントのうち10だけでした。
package main
import (
"os/exec"
"sync"
"path/filepath"
"os"
"fmt"
"strings"
)
// root dir of your documents to convert
root := "/.../conversion-from-office/"
var tasks = make(chan *exec.Cmd, 64)
func visit(path string, f os.FileInfo, err error) error {
if (f.IsDir()) {
// fmt.Printf("Entering %s\n", path)
} else {
ext := filepath.Ext(path)
if (strings.ToLower (ext) == "pdf") {
} else {
outfile := path[0:len(path)-len(ext)] + ".pdf"
if _, err := os.Stat(outfile); os.IsNotExist(err) {
fmt.Printf("Converting %s\n", path)
outdir := filepath.Dir(path)
tasks <- exec.Command("soffice", "--headless", "--convert-to", "pdf", path, "--outdir", outdir)
}
}
}
return nil
}
func main() {
// spawn four worker goroutines
var wg sync.WaitGroup
// the ...; i < 4;... indicates that I'm using 4 threads
for i := 0; i < 4; i++ {
wg.Add(1)
go func() {
for cmd := range tasks {
cmd.Run()
}
wg.Done()
}()
}
err := filepath.Walk(root, visit)
fmt.Printf("filepath.Walk() returned %v\n", err)
close(tasks)
// wait for the workers to finish
wg.Wait()
}