PDFtk est un outil puissant pour la manipulation de fichiers PDF. J'ai eu besoin de ce genre d'outil pour l'impression du manuel de programmation de la Game Boy. Il devait être aux normes, et cela n'a pas été une mince affaire.

Le fichier source est GameBoyProgManVer1.1.pdf (3,3 Mio).
Le fichier corrigé et optimisé : gameboy-programming-v1.1.pdf (1,8 Mio).


Orienter

Les pages 301, 302 et 303 du manuel sont en mode paysage alors que toutes les autres sont en mode portrait. Voici comment réorienter ces 3 pages :

$ pdftk \
    "GameBoyProgManVer1.1.pdf" \
    cat \
    1-300 \
    301-303left \
    304-end \
    output \
    "manual-fixed.pdf"

Redimensionner

Pour vérifier que toutes les pages ont les même marges :

$ cat -v "GameBoyProgManVer1.1.pdf" | grep MediaBox | sort | uniq
/MediaBox [0 0 595 842]
/MediaBox [0 0 612 792]

Redimensionnons toutes les pages :

$ sed 's/MediaBox \[0 0 595.*/MediaBox \[0 0 612 792\]/g' \
    "GameBoyProgManVer1.1.pdf" \
    > "manual-fixed.pdf"

Fusionner

Pour fusionner plusieurs fichiers PDF en un seul :

$ pdftk \
    "cover.pdf" \
    "manual-fixed.pdf" \
    cat \
    output \
    "book.pdf"

Incorporer les Polices Manquantes

Il manquait quelques polices (que j'ai du convertir au format postscript). Les fichiers sont placés dans le dossier "pdf-fonts" :

$ gs \
    -o "manual-fixed.pdf" \
    -sDEVICE=pdfwrite \
    -dPDFSETTINGS=/prepress \
    -dEmbedAllFonts=true \
    -sFONTPATH="./pdf-fonts" \
    "GameBoyProgManVer1.1.pdf"

En réalité, cette commande a été prise de tête, j'ai donc ouvert le PDF sur un Mac, et fait un nouvel export. Les polices manquantes furent intégrées automatiquement.


Optimiser

GhostScript permet de réduire grandement le poids du fichier final :

$ gs \
    -o "gameboy-programming-v1.1.pdf" \
    -sDEVICE=pdfwrite \
    -dPDFSETTINGS=/prepress \
    -dEmbedAllFonts=true \
    "manual-fixed.pdf"

Personnaliser les Metadata

Exporter les metadatas actuelles dans le fichier metadata.txt :

$ pdftk guide-v1.pdf dump_data_utf8 output metadata.txt

Le contenu du fichier ressemble à ça :

InfoBegin
InfoKey: ModDate
InfoValue: D:20191114220102Z
InfoBegin
InfoKey: Producer
InfoValue: <PRODUCTER>
PdfID0: d8ec8095099bebfa395c663ac4e4a26e
PdfID1: 6f977277cf1bfe9a5b8c1c60f2ba175d
NumberOfPages: 158
PageMediaBegin
PageMediaNumber: 1
PageMediaRotation: 0
PageMediaRect: 0 8.58 1,057.5 1,696.08
PageMediaDimensions: 1,057.5 1,687.5
...

Modifier les première lignes ou ajouter les metadata manquantes (parmis : Title, Author, Subject, Keywords, Creator, Producer, CreationDate, ModDate et Trapped):

InfoBegin
InfoKey: Title
InfoValue: <TITLE>
InfoBegin
InfoKey: Author
InfoValue: >AUTHOR>
InfoBegin
InfoKey: CreationDate
InfoValue: D:20191114220102Z
InfoBegin
InfoKey: ModDate
InfoValue: D:20200409101248Z
InfoBegin
InfoKey: Producer
InfoValue: <PRODUCTER>
PdfID0: d8ec8095099bebfa395c663ac4e4a26e
PdfID1: 6f977277cf1bfe9a5b8c1c60f2ba175d
NumberOfPages: 158
PageMediaBegin
PageMediaNumber: 1
PageMediaRotation: 0
PageMediaRect: 0 8.58 1,057.5 1,696.08
PageMediaDimensions: 1,057.5 1,687.5
...

Générer un nouveau PDF comportant les bonnes metadata :

$ pdftk guide-v1.pdf update_info_utf8 metadata.txt output guide-v2.pdf

Historique