Napisałem program w golang na konwertowanie tysięcy plików doc/xls.
- określenie „root” zmienną wartość ścieżki dokumentów do konwersji
- już przekształcane dokumenty PDF są pomijane (jeśli nie, komentarz warunek wyboru w funkcji wizyty())
- tutaj Używam 4 wątków (mam Intel i3 z 4 rdzeniami). Możesz zmodyfikować wartość w funkcji głównej()
Czasami może się zdarzyć, że Libreoffice nie konwertuje niektórych plików, więc powinieneś otworzyć i przekonwertować je na PDF ręcznie. Na szczęście, udało mi się przekonwertować tylko 10 z 16 000 moich dokumentów.
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()
}
Czy chcesz uruchomić pojedyncze polecenie 'libreoffice' na wielu procesorach lub wykonywać wiele połączeń z' libreoffice' i konwertować pliki osobno? W pierwszym przypadku nie można nic zrobić, w drugim przypadku jest to proste. – Bakuriu
Uhm, wierzę, że 'libreoffice' zapobiega równoczesnemu uruchomieniu więcej niż jednego konwertera PDF. Próba utworzenia wielu procesów powoduje wygenerowanie pojedynczego pliku '.pdf', a pozostałe procesy kończą się niepowodzeniem. Dzieje się tak nawet przy użyciu opcji '--nolockcheck'. Wierzę, że odpowiedź na twoje pytanie brzmi: nie możesz. Powinieneś użyć innego programu do konwersji. – Bakuriu
Wierzę, że kiedyś czytałem, że libreoffice zawsze używa tylko jednego procesu (także w odniesieniu do pisarza, zaimponować itd.), Co prawdopodobnie uniemożliwiłoby to. – lolopop