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.ℹ️
pdftkoriginal n'est plus maintenu depuis 2013. Son remplaçantpdftk-javapropose la même interface en ligne de commande. Beaucoup de ces opérations sont également réalisables avecpoppler-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.