Exporter un PPTX en PDF
J’ai en entrée un fichier PPTX qui contient du texte mis en forme et des images, et je souhaite le convertir en PDF. Mais pas en tant qu’utilisateur Windows : en tant que script / programme externe.
En Java
Je n’ai rien trouvé de concluant en Java.
- Avec Apache POI, il n’est pas possible d’exporter le texte. On ne peut que exporter tout en image.
- En plus certains formatages ne fonctionnent pas (texte sur plusieurs colonnes par exemple).
- Il existe la librairie “Aspose” qui permet théoriquement de faire ça, mais elle coûte une blinde.
En Python
En Python, le plus simple est de créer un objet “Powerpoint.Application” avec la librairie “comtypes”, mais cela ne fonctionne que sous Windows.
Sous Linux
On peut exporter un PPTX en PDF avec LibreOffice en headless :
libreoffice --headless --convert-to pdf:writer_pdf_Export in.pptx
Il faut impérativement que les polices soient présentes sur le système.
Pour installer une police il faut :
- la copier dans
/usr/share/fonts/truetype/
- mettre à jour le cache des polices avec la commande
fc-cache
- on peut vérifier que la police est bien présente avec la commade
fc-list | grep ma_police
Le fait d’appeler LibreOffice en headless comme ça fera qu’il se chargera en mémoire puis se fermera après la conversion, ce qui peut prendre du temps.
Pour optimiser, on peut utiliser : GitHub – unoconv/unoserver
- D’un côté on lance un serveur qui chargera LibreOffice en mémoire :
unoserver
- D’un autre côté, on appelle l’instance en utilisant le bon port :
unoconvert in.pptx out.pdf
Pour que les marges soient conservées, il faut utiliser une version récente de LibreOffice.
Note : on peut exécuter libreoffice depuis Python :
import os
from subprocess import Popen
def convert_pptx_to_pdf(input_pptx, output_pdf):
libreoffice_exec = "libreoffice"
command = [libreoffice_exec, "--headless", "--convert-to", "pdf", "--outdir", os.path.dirname(output_pdf), input_pptx]
process = Popen(command, stdout=None, stderr=None)
process.wait()
input_pptx = "/chemin/vers/le/fichier.pptx"
output_pdf = "/chemin/vers/le/fichier.pdf"
convert_pptx_to_pdf(input_pptx, output_pdf)