Convertir un Word en PDF en ligne de commande

Mis à jour le · LibreOffice (7.4 et versions suivantes), Word pour Windows, PowerShell, pandoc

La commande la plus universelle est soffice --headless --convert-to pdf document.docx : LibreOffice convertit le fichier sans ouvrir de fenêtre, sous Windows, macOS et Linux. Si Word est installé sous Windows, un script PowerShell qui pilote Word donne un PDF identique à celui de Word.

En bref

  1. Installez LibreOffice (gratuit).
  2. Lancez soffice --headless --convert-to pdf --outdir pdf document.docx.
  3. Le PDF apparaît dans le dossier pdf. Fermez LibreOffice avant, sinon la commande peut ne rien produire.

LibreOffice sans interface : soffice --convert-to pdf

soffice --headless --convert-to pdf --outdir /chemin/sortie document.docx

Le PDF porte le nom du document avec l’extension .pdf, et un fichier du même nom déjà présent est remplacé. La même commande accepte les .doc, .odt et .rtf.

Chemin de l’exécutable selon le système

SystèmeCommande
Windows (invite de commandes)"C:\Program Files\LibreOffice\program\soffice.exe"
Windows (PowerShell)& 'C:\Program Files\LibreOffice\program\soffice.exe'
macOS/Applications/LibreOffice.app/Contents/MacOS/soffice
Linux (paquet de la distribution)soffice ou libreoffice
Linux (Flatpak)flatpak run org.libreoffice.LibreOffice

Exemple complet sous Windows, depuis l’invite de commandes :

"C:\Program Files\LibreOffice\program\soffice.exe" --headless --convert-to pdf --outdir C:\PDF C:\Docs\rapport.docx

Et sur Mac :

/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to pdf --outdir ~/Desktop ~/Documents/rapport.docx

Sous Linux, l’installation et les polices à ajouter sont détaillées dans Word en PDF sous Linux.

Options PDF : PDF/A, plage de pages, balises

Depuis LibreOffice 7.4, les options d’export se passent en JSON après un deuxième deux-points. Chaque option prend la forme "Nom":{"type":"…","value":"…"}. Pour un PDF/A, sous Linux et macOS :

soffice --headless --convert-to 'pdf:writer_pdf_Export:{"SelectPdfVersion":{"type":"long","value":"2"}}' document.docx

Le même exemple dans l’invite de commandes Windows, où les guillemets internes s’échappent par une barre oblique inverse :

"C:\Program Files\LibreOffice\program\soffice.exe" --headless --convert-to pdf:writer_pdf_Export:{\"SelectPdfVersion\":{\"type\":\"long\",\"value\":\"2\"}} document.docx
OptionTypeValeurs
SelectPdfVersionlong0 : PDF 1.7 (par défaut) · 1 : PDF/A-1b · 2 : PDF/A-2b · 3 : PDF/A-3b · 15 / 16 / 17 : PDF 1.5 / 1.6 / 1.7
PageRangestringPages à exporter, par exemple "2-5"
UseTaggedPDFboolean"true" pour un PDF balisé (accessibilité)
PDFUAComplianceboolean"true" pour viser la norme PDF/UA
ExportBookmarksboolean"true" par défaut : les titres deviennent des signets

Plusieurs options se combinent dans le même objet, séparées par une virgule :

soffice --headless --convert-to 'pdf:writer_pdf_Export:{"SelectPdfVersion":{"type":"long","value":"2"},"UseTaggedPDF":{"type":"boolean","value":"true"}}' document.docx

La liste complète figure dans l’aide officielle : paramètres PDF en ligne de commande.

Dans Windows PowerShell 5.1 (et PowerShell 7 avant la version 7.3), les guillemets doubles placés à l’intérieur d’un argument sont supprimés avant d’atteindre soffice : le JSON arrive cassé et les options sont ignorées. Utilisez l’invite de commandes, ou PowerShell 7.3 et plus avec la forme entre apostrophes.

Les pièges de soffice

La commande ne produit rien

Si LibreOffice est déjà ouvert (y compris son démarrage rapide), la commande est transmise à l’instance existante et la conversion peut échouer sans message. Fermez LibreOffice, ou donnez à la conversion un profil utilisateur séparé :

soffice -env:UserInstallation=file:///tmp/lo-conversion --headless --convert-to pdf document.docx

Sous Windows, le chemin s’écrit file:///C:/Temp/lo-conversion. C’est aussi la bonne pratique pour lancer plusieurs conversions en parallèle ou sur un serveur : un profil par processus.

La mise en page diffère de Word

LibreOffice recalcule la pagination avec les polices présentes sur la machine. Sur un serveur sans Calibri ni Cambria, installez au minimum les polices métriquement compatibles Carlito et Caladea. Voir polices différentes dans le PDF.

Aucun message dans la console Windows

Utilisez soffice.com (dans le même dossier que soffice.exe) : cette variante console attend la fin de la conversion et affiche les messages.

Windows : PowerShell et Word (COM)

Si Microsoft Word est installé, PowerShell peut le piloter et appeler la méthode ExportAsFixedFormat, la même que Fichier › Exporter. Le rendu est celui de Word, au pixel près. Le chiffre 17 correspond à la constante wdExportFormatPDF.

$docx = (Resolve-Path '.\rapport.docx').Path
$pdf  = [System.IO.Path]::ChangeExtension($docx, '.pdf')
$word = New-Object -ComObject Word.Application
$word.Visible = $false
try {
    $doc = $word.Documents.Open($docx, $false, $true)   # ConfirmConversions, ReadOnly
    $doc.ExportAsFixedFormat($pdf, 17)                   # 17 = wdExportFormatPDF
    $doc.Close($false)
} finally {
    $word.Quit()
}

Word exige des chemins absolus, d’où Resolve-Path. Pour obtenir des signets à partir des titres et un PDF/A (ISO 19005-1), il faut renseigner les paramètres dans l’ordre, car PowerShell ne permet pas de les nommer :

# OutputFileName, ExportFormat, OpenAfterExport, OptimizeFor, Range, From, To, Item,
# IncludeDocProps, KeepIRM, CreateBookmarks, DocStructureTags, BitmapMissingFonts, UseISO19005_1
$doc.ExportAsFixedFormat($pdf, 17, $false, 0, 0, 1, 1, 0, $true, $true, 1, $true, $true, $true)

Ici, 0 pour OptimizeFor signifie « impression », 0 pour Range « tout le document », 1 pour CreateBookmarks « signets à partir des titres ». La documentation de la méthode est sur Microsoft Learn.

Si l’exécution des scripts est bloquée, lancez le fichier avec powershell -ExecutionPolicy Bypass -File .\convertir.ps1. Microsoft déconseille d’automatiser Office sur un serveur sans session utilisateur : pour un service, préférez LibreOffice.

Pandoc, et pourquoi l’éviter ici

pandoc document.docx -o document.pdf

Pandoc ne « convertit » pas la mise en page : il extrait la structure (titres, paragraphes, listes, tableaux, images) et la recompose avec LaTeX, qu’il faut installer à part (pdflatex par défaut, --pdf-engine=xelatex pour utiliser les polices du système). Marges, polices, en-têtes, pieds de page et zones de texte du document Word sont perdus. C’est utile pour publier un texte, pas pour obtenir le PDF fidèle d’un .docx.

Quelle méthode choisir ?

MéthodeSystèmesFidélité à WordPDF/AServeur
LibreOffice sofficeWindows, macOS, LinuxBonne si les polices sont présentes1b, 2b, 3bOui
PowerShell + WordWindowsExactePDF/A-1Déconseillé
pandocWindows, macOS, LinuxMise en page refaiteNonOui

Pour traiter un dossier entier, les variantes avec *.docx et une boucle PowerShell sont dans convertir plusieurs Word en PDF.

Un seul document à convertir et pas envie d’ouvrir un terminal ? Le convertisseur du site fonctionne dans le navigateur, sans envoi du fichier.

Convertir sans ligne de commande