Aide-mémoire: Modification de pdfs en ligne de commande

par Damien Mégy   cli pdf qpdf poppler pdftk shell terminal

Table des matières

Outils, sources et installation

Sources pour ce document :

https://qpdf.readthedocs.io/ https://github.com/qpdf/qpdf

Prérequis : pdftk-java (pdftk), ghostscript (gs), poppler (pdfinfo, pdftotext, pdfseparate, pdfunite…), qpdf.

ℹ️ pdftk original n'est plus maintenu depuis 2013. Son remplaçant pdftk-java propose la même interface en ligne de commande. Beaucoup de ces opérations sont également réalisables avec poppler-utils, sans dépendance Java.

installation des outils :

brew install qpdf poppler

Inspection d'un pdf

Informations en général:

# Avec poppler :
pdfinfo document.pdf

# Nombre de pages, un peu inutile mais pour l'exemple :
pdfinfo document.pdf | grep Pages
# ou avec qpdf
qpdf --show-npages document.pdf

Diagnostic

qpdf --check document.pdf

Polices utilisées :

# Avec poppler
pdffonts document.pdf

Extraire le texte brut d'un PDF

# avec poppler — sortie sur stdout
pdftotext document.pdf -
# pages 2 à 5 : 
pdftotext -f 2 -l 5 document.pdf -

# avec poppler —vers un fichier
pdftotext document.pdf document.txt

# avec poppler — conserver la mise en page (colonnes, espacements)
pdftotext -layout document.pdf document.txt

Extraire les images embarquées dans un PDF

# avec poppler
pdfimages -all document.pdf images/img

Recadrage

cropbox cropping

Le contenu n'est pas effacé, il est juste caché

mediabox cropping

Mettons que la media box soit de 0 0 612 792 (obtenu avec pdfinfo par exemple). On peut alors faire :

qpdf in.pdf --pages . -- --mediabox "100 100 500 700" out.pdf
qpdf out.pdf --pages . -- --mediabox "0 0 612 792" recovered.pdf

La restauration n'est possible que si aucun autre logiciel n'a réécrit le PDF entre-temps.

pdfcrop avec les marges

plus simple : pdfcrop input.pdf cropped.pdf


Manipulation des pages

Diviser un PDF en fichiers d'une page chacun

# avec pdftk-java
pdftk input.pdf burst output page_%03d.pdf

# avec poppler
pdfseparate input.pdf page_%03d.pdf

Fusionner plusieurs PDFs en un seul

Fusion de tous les pdfs du dossier :

# avec pdftk-java
pdftk *.pdf cat output merged.pdf

# avec poppler
pdfunite *.pdf merged.pdf

Fusion avec ordre explicite:

pdfunite cover.pdf chapter*.pdf appendix.pdf book.pdf

Extraire des pages d'un pdf :

# == avec pdftk-java
pdftk original.pdf cat 3-7 output extrait.pdf

# == avec qpdf
qpdf original.pdf --pages 3-7 -- extrait.pdf

# == avec poppler
pdfseparate -f 3 -l 7 original.pdf page-%d.pdf
pdfunite page-{3,4,5,6,7}.pdf extrait.pdf
# ou 
pdfunite $(printf "page-%d.pdf " {3..7}) extrait.pdf
# puis
rm page-{2..7}.pdf

Supprimer des pages:

# avec poppler:
qpdf input.pdf --pages . 1-4,8-z -- output.pdf
# ou avec pdftk:
pdftk input.pdf cat 1-4 8-end output output.pdf

Réorganiser des pages

pdftk input.pdf cat 5 1 2 3 4 output reordered.pdf
# ou:
qpdf input.pdf --pages . 5,1-4 -- reordered.pdf

Faire pivoter toutes les pages de 90°

qpdf --rotate=+90 input.pdf output.pdf

Conversion de pdf (svg, png, html)

Pdf to svg

# Avec inkscape :
inkscape myfile.pdf --export-type=svg

# Avec poppler
pdftocairo -svg myfile.pdf myfile.svg
# Pour traiter tout un dossier:
for f in \*.pdf; do
pdftocairo -svg "$f" "${f%.pdf}.svg"
done

Pdf to png

pdftocairo -png -r 150 file.pdf frame produit frame-01.png, frame-02.pbg etc, une image par page. Mettre une résolution 300 pour impression

Remarque : on peut lui dire de ne prendre que la cropbox, car pdftocairo prend tout par défaut:

pdftocairo -png -cropbox input.pdf output sinon il faut cropper avant avec une autre méthode

en niveaux de gris et 100ppp: pdftocairo -png -gray -r 100 file.pdf page

Convertir un PDF en HTML (avec mise en forme)

# avec poppler
pdftohtml document.pdf

Sécurité

Protéger un PDF par mot de passe

qpdf --encrypt MonMotDePasse MonMotDePasseOwner 256 -- input.pdf output.pdf

Supprimer le mot de passe d'un PDF

qpdf --password=MonMotDePasse --decrypt input.pdf output.pdf

Autres

OCR

ocrmypdf input.pdf output.pdf
# ou 
ocrmypdf --language fra input.pdf output.pdf

Ajouter un fond de page (tampon) à un PDF

pdftk input.pdf stamp tampon.pdf output output.pdf

Compresser un PDF avec Ghostscript

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf

Niveaux de compression : /screen (72dpi) < /ebook (150dpi) < /printer (300dpi) < /prepress

Décompresser un pdf

qpdf --qdf --object-streams=disable input.pdf output.pdf

Pratique pour faire des diffs Git, voir la structure interne etc.