Faq/General/150
TDF LibreOffice Document Liberation Project Blogs gemeenschap Weblate Nextcloud Redmine Ask LibreOffice Doneren
Context
In Windows 10 kunnen we met een commando als soffice.exe --convert-to odt my_document.docx gebruiken om een bestand van het docx-formaat van Microsoft om te zetten naar het Open Document formaat (odt). Met --convert-to mogen we een aantal documenten specificeren door een wildcard te gebruiken. Voorbeeld: met *.docx kunnen we dan aangeven dat we alle docx-bestanden in de huidige map bedoelen.
Probleem
Maar als we dit in de Windows Command shell doen, dan werkt dit niet. Alle conversies lijken tegelijk te starten, omdat er maar een instantie van LibreOffice (soffice.exe) echt actief kan worden bij het opstarten vanaf de commandoregel, blijft het proces hangen. Er zal best een of twee bestanden geconverteerd worden maar je zult wel meerdere processen handmatig moeten stoppen (kill).
Oplossing
We gebruiken hiervoor het Windows Subsysteem voor de Linux (WSL) omgeving, die door Windows vanaf Windows10 wordt aangeboden. Mogelijk moet het wel eerst worden geïnstalleerd. Dat is hier beschreven.
Daarna heb je toegang tot een Bash shell bovenop je Windows-systeem, en zal --convert-to goed werken, en synchroon.
Beknopte beschrijving
- Bepaal het pad naar soffice.exe.
- Ga in de shell met
cd
naar de map met te converteren bestanden, nadat je een map hebt bepaald waar de geconverteerde bestanden moeten komen te staan. - Voer dit commando uit: <pad naar soffice.exe> --convert-to odt --outdir <mijn_map_met_geconverteerde_bestanden> *.docx
Voorbeeld
"/mnt/c/Program Files/LibreOffice 5/program/soffice.exe" --convert-to odt --outdir ./Converted_To_odt *.docx zal de docx-bestanden in de huidig map converteren naar de map /Converted_To_odt
Waarom deze syntaxis?
WSL mount een compleet bestandsysteem van zichzelf. Hierdoor is de syntaxis om een bestandslocatie aan te geven anders dan onder Windows. Het eerste verschil is het rootpunt: In Windows is het C:\, de tegenhanger van de bash shell is /mnt/c/. Het token scheidingsteken is in Windows \, in de bash is het die van Unix /. Verder zijn de regels gelijk. Zet bij bestandsnamen met een of meer spaties, dubbele-quotes (") om de bestandsnaam.
Hoe het commando te schrijven?
Bekijk de snelkoppeling die je gebruikt om LibreOffice te starten. Rechts-klik op het bestand en dan op "Eigenschappen", kopieer de inhoud van "Doel". In het voorbeeld is dat dan: "C:\Program Files\LibreOffice\program\soffice.exe". Pas dit aan naar wat het dan voor de bash shell wordt, dus : "/mnt/C:/Program Files/LibreOffice/program/soffice.exe" NB: Unix is hoofdlettergevoelig, Windows niet.
Klaar.
Conclusie
De Bash shell is in Windows een eenvoudige manier op meerdere bestanden te converteren van het bestandsformaat met gebruik van de ingebouwde LibreOffice commandoregel.
Het kan ook interactief
Nog eenvoudiger is het gebruiken van het ingebouwde LibreOffice Document conversieprogramma.
Starten: ▸ ▸
Volgens een gebruiker is er wel een grens aan het aantal tegelijk te converteren documenten, als het programma crashed probeer dan een lager aantal in een keer te converteren.
Een langere beschrijving
Het probleem is niet dat alle conversies tegelijk worden gestart maar dat LibreOffice's --convert-to
eigenlijk geen wildcards ondersteund. Het werkt wel op niet-Windows omdat die de wildcards verwerken in hun shell. (Op Windows werkt het in een shell ook wel, bijvoorbeeld met Cygwin of WSL).
Dat betekent dat in Bash, bij het uitvoeren van het commando soffice --convert-to odt path/to/*.doc
, het commando eerst geanalyseerd wordt door Bash, dat het deel path/to/*.doc
vertaalt naar een opsomming van de bestanden die aan dat masker voldoen. De opsomming is dan een tekenreeks die het deel path/to/*.doc
vervangt met iets als path/to/1.doc path/to/2.doc path/to/345.doc
. Dat is wat LibreOffice ziet.
Het Windows-commando cmd.exe doet dat omzetten niet, waarna LibreOffice denkt dat het een bestand *.doc
moet openen, dat zal niet lukken.
In cmd.exe zou het voorverwerken expliciet gedaan kunnen worden, iets als volgt:
for %f in ("path\to\*.doc") do "C:\Program Files\LibreOffice\program\soffice" --convert-to odt "%f"
Dit verzoek tot uitbreiding (hier wildcards kunnen gebruiken) is in behandeling genomen tdf#48413. Mogelijk werkt het in de versies na mei 2021 uitgebracht, mogelijk zonder het gedeelte submappen.