Vous écrivez \includepdf{paper.pdf} et une seule page arrive. C’est la première marche sur laquelle tout le monde trébuche avec le pdfpages de LaTeX, et la raison est que l’option vaut par défaut pages=1 — la page un seulement. Mesuré : un PDF de cinq pages inséré sans option a produit exactement une page. Pour tout prendre, écrivez pages=- (le même PDF en a alors donné cinq). Ce seul caractère appris, le reste de pdfpages s’ouvre — le package est d’Andreas Matthias, et la version livrée avec TeX Live 2024 est la v0.5y, datée du 2024/01/21. Ajouter une couverture, assembler des PDF par chapitre en une thèse, disposer des diapositives 2×2 pour un polycopié, tamponner DRAFT sur chaque page, ajouter des entrées aux signets et à la table des matières : cette page parcourt tout cela en compilant au passage.
Comment s’emploie \includepdf et en quoi il diffère de \includegraphics
Chargez \usepackage{pdfpages} dans le préambule et appelez \includepdf[…]{fichier} dans le corps. La différence est qu’il travaille feuille par feuille. \includegraphics place le PDF dans le flux du texte comme une image : tout ce qui dépasse le bloc de texte déborde, et les marges du document s’appliquent encore. \includepdf ouvre une feuille neuve et met la page source à l’échelle automatiquement pour l’y loger. Mesuré : un PDF créé en A5 (419,5 x 595,3pt) inséré dans un document au format letter est sorti sur des feuilles letter de 612 x 792pt — c’est la page source qui a été mise à l’échelle, pas le papier. Le nom de fichier ne doit contenir aucune espace.
En interne, \includepdf appelle le \includegraphics de graphicx : toute option que pdfpages n’interprète pas lui-même — trim, clip, scale, angle, etc. — lui est donc transmise telle quelle. Pour rogner en-tête et pied des pages importées, écrivez \includepdf[pages=-, trim=0 2cm 0 2cm, clip]{paper.pdf}. Pour désactiver la mise à l’échelle automatique il y a noautoscale, et pour décaler la page insérée offset, qui prend deux dimensions.
\documentclass{article}
\usepackage{pdfpages}
\begin{document}
% body text ...
\includepdf[pages=-]{cover.pdf}
% ... body text continues
\end{document}Écrire l’option pages : toutes les pages, ordre inverse, feuilles blanches
L’option pages énumère, séparées par des virgules, les pages à insérer et leur ordre. Un intervalle s’écrit m-n ; sans m il désigne la première page, sans n la dernière. pages=- se lit donc « de la première à la dernière ». La page finale peut aussi se nommer par le mot-clé last, valable uniquement à l’intérieur d’un intervalle. C’est l’ordre qui devient intéressant : pages=last-1 insère le fichier à l’envers, et mesuré, un PDF de huit pages est sorti de PAGE 8 à PAGE 1.
L’autre astuce à retenir est le {} vide. Un {} dans la liste produit une feuille blanche à cet endroit. pages={1,{},2-21} donne couverture, page blanche, puis les pages 1 à 20 du corps. Mesuré, pages={1,{},2} a produit trois pages dont le texte extrait ne contenait que PAGE 1 et PAGE 2 : celle du milieu était bien blanche. C’est ainsi qu’on fait démarrer chaque chapitre d’une thèse recto verso sur une page de droite.
% cover, then one blank leaf, then body pages 1-20
\includepdf[pages={1,{},2-21}]{thesis-cover.pdf}
% every page, in reverse order
\includepdf[pages=last-1]{scan.pdf}
% a hand-picked selection, in this order
\includepdf[pages={3,1,4,1,5}]{notes.pdf}| Ce que vous écrivez | Pages insérées |
|---|---|
(omitted) | la page 1 seulement — la valeur par défaut est pages=1 |
pages=- | toutes les pages, de la première à la dernière |
pages={2-8} | les pages 2 à 8 |
pages={1,3,5} | seulement les pages 1, 3 et 5, dans cet ordre |
pages={3,{},15} | page 3, une feuille blanche, page 15 |
pages=last-1 | toutes les pages à l’envers ; last n’est valable que dans un intervalle |
pages={1-3,5,{},7} | intervalles, pages isolées et blancs se mélangent librement |
Un polycopié 2x2 avec nup — et landscape inscrit un /Rotate
nup=largeur x hauteur dispose plusieurs pages logiques sur une seule feuille. Mesuré, un PDF de huit diapositives importé avec nup=2x2 a produit deux feuilles, et nup=2x1, landscape quatre. Les pages se remplissent par défaut ligne par ligne ; column passe au remplissage par colonnes, et columnstrict conserve cet ordre même sur la dernière feuille. delta ménage des espaces entre les pages (deux dimensions, comme delta=5mm 5mm) et frame encadre chacune d’elles.
landscape fait pivoter la feuille, pas les pages qui y sont posées ; pour faire tourner les pages elles-mêmes, utilisez angle=90. Ce qui est intéressant, c’est que ce landscape inscrit un /Rotate 90 dans le PDF. Examinez un fichier construit avec nup=2x1, landscape à l’aide de pdfinfo -f 1 -l 1 : vous obtenez Page 1 rot: 90 alors que la taille de page reste 612 x 792 — le lecteur la tourne pour vous. Pour supprimer ce comportement, posez turn=false (la valeur par défaut est turn=true). Le package pdflscape emploie le même mécanisme ; la page consacrée aux tableaux plus larges que le bloc de texte les compare en détail.
% four slides per sheet, boxed, with a gap between them
\includepdf[pages=-, nup=2x2, frame, delta=5mm 5mm]{slides.pdf}
% two pages side by side on a landscape sheet
\includepdf[pages=-, nup=2x1, landscape]{report.pdf}fitpaper : adapter la feuille au PDF source
Par défaut, la page source est mise à l’échelle de votre papier ; fitpaper=true inverse cela et ajuste la taille de la feuille au PDF source. Mesuré, un PDF A5 de huit pages inséré dans un document letter avec fitpaper=true a donné des pages de sortie de 419,527 x 595,275pt — l’A5 d’origine, intact. Utile pour les scans, que la mise à l’échelle dégraderait, et pour les formulaires à rendre dont la géométrie de page est déjà figée.
Il existe des outils pour les fichiers dont les pages n’ont pas toutes la même taille. Par défaut, la première page insérée sert de gabarit, et toutes les suivantes sont mises à l’échelle pour tenir dans son contour. Pour en désigner une autre, utilisez pagetemplate=⟨numéro de page⟩ ; pour donner directement la taille, templatesize={⟨largeur⟩}{⟨hauteur⟩} — prévoyez un peu plus grand que voulu, afin d’éviter les erreurs d’arrondi. Une page en paysage arrivant sur un gabarit portrait est réduite par défaut, mais rotateoversize=true la fait pivoter pour l’ajuster. Et si vous voulez imprimer en double et couper la pile en deux exemplaires ensuite, doublepages insère chaque page deux fois.
| Option | Ce qu’elle fait (valeur par défaut) |
|---|---|
nup | disposer plusieurs pages sur une feuille ; nup=2x2 = 2 en largeur × 2 en hauteur. Par défaut 1x1 |
frame | encadrer chaque page logique par un filet d’épaisseur \fboxrule. Par défaut false |
delta | espace entre les pages disposées ; deux dimensions séparées par une espace. Par défaut 0 0 |
landscape | mettre la feuille en paysage et inscrire /Rotate 90 dans le PDF. Par défaut false |
turn | si les pages en paysage sont affichées pivotées par le lecteur. Par défaut true |
scale | un facteur d’échelle transmis à \includegraphics ; à combiner avec noautoscale pour un contrôle manuel |
fitpaper | ajuster la taille de la feuille à celle du document inséré. Par défaut false |
offset | déplacer l’origine des pages insérées ; deux dimensions. Par défaut 0 0 |
pagecommand | code LaTeX exécuté sur chaque page insérée. Par défaut \thispagestyle{empty} |
picturecommand | commandes exécutées dans un picture dont l’origine est le coin inférieur gauche. Par défaut vide |
link | faire des pages insérées des cibles de liens nommées ⟨nom de fichier⟩.⟨numéro de page⟩. Par défaut false ; renommer avec linkname |
Rétablir les numéros de page et tamponner DRAFT : pagecommand et picturecommand
Pour que les numéros de page de votre document s’impriment sur les pages importées, utilisez pagecommand. L’option reçoit du code LaTeX exécuté sur chaque page insérée ; pdfpages.sty en définit la valeur par défaut à \thispagestyle{empty} — d’où l’absence de folio et de titre courant sur les pages importées. Remplacez-la par pagecommand={\thispagestyle{plain}} et vos propres numéros s’impriment par-dessus.
Un piège se cache ici : redéfinir pagecommand pour vos propres besoins supprime du même coup le \thispagestyle{empty} par défaut. Mesuré, un document ne transmettant à pagecommand que du code de filigrane a imprimé les numéros 1, 2, 3… sur les pages importées, sans que ce soit voulu. Si vous n’en voulez pas, faites précéder votre code d’un \thispagestyle{empty}.
Pour le tamponnage lui-même, il existe un crochet dédié. picturecommand reçoit des commandes exécutées dans un environnement picture dont l’origine est le coin inférieur gauche de chaque page — une origine qui ne bouge pas même lorsque la page est tournée par landscape. Mesuré, une importation de huit pages avec picturecommand={\put(30,30){\Large CONFIDENTIAL}} est ressortie de pdftotext en PAGE 1 CONFIDENTIAL PAGE 2 CONFIDENTIAL …, tamponnée sur chaque page. Pour ne tamponner que la toute première, utilisez picturecommand*.
% your own page numbers on the imported pages
\includepdf[pages=-, pagecommand={\thispagestyle{plain}}]{paper.pdf}
% stamp every imported page; the picture origin is its lower-left corner
\includepdf[pages=-,
picturecommand={\put(30,30){\Large CONFIDENTIAL}}]{paper.pdf}
% ...and picturecommand* would stamp only the first inserted pageAssembler une thèse à partir de PDF par chapitre : includepdfmerge et addtotoc
La commande qui assemble des PDF composés séparément est \includepdfmerge. Son argument est une suite « nom de fichier, spécification de pages, nom de fichier, spécification de pages, … », la spécification reprenant la syntaxe de pages ; omise, seule la première page du fichier est prise. Mesuré, \includepdfmerge{a.pdf,1-2,b.pdf,3} a produit trois pages affichant PAGE 1, PAGE 2, SOURCE PAGE 3. Pour éviter de répéter les mêmes options, \includepdfset{…} en fixe les valeurs par défaut, que les options écrites sur un \includepdf particulier viennent surcharger.
Un PDF inséré n’apparaît de lui-même ni dans la table des matières ni dans les signets. addtotoc y remédie ; il prend cinq arguments séparés par des virgules : addtotoc={⟨numéro de page⟩,⟨section⟩,⟨niveau⟩,⟨titre⟩,⟨label⟩}. Le numéro de page compte parmi les pages insérées, section est un nom de commande de sectionnement, le niveau sa profondeur sous forme de nombre, le titre la chaîne à imprimer dans la table, et le label un nom que \ref et \pageref peuvent viser. L’ordre des cinq ne doit pas être modifié.
Associée à hyperref, cette seule option fait trois choses à la fois. Mesuré : avec hyperref chargé, addtotoc={1,section,1,Imported paper,sec:paper} a écrit \contentsline {section}{\numberline {2}\ignorespaces Imported paper}{2} dans le .toc, produit \BOOKMARK [1][-]{section.2}{Imported paper}{} dans le .out, et fait résoudre correctement \ref{sec:paper} et \pageref{sec:paper} depuis le corps. Une entrée de table, un signet PDF et une référence croisée fonctionnelle, le tout d’une seule ligne. Pour les listes de figures ou de tableaux, il y a addtolist.
\documentclass{article}
\usepackage{hyperref}
\usepackage{pdfpages} % load pdfpages after hyperref
\begin{document}
\tableofcontents
\section{Front matter}
% one contents entry, one PDF bookmark, one \ref target
\includepdf[pages=-,
pagecommand={\thispagestyle{plain}},
addtotoc={1,section,1,Imported paper,sec:paper}]{paper.pdf}
\section{After}
See \ref{sec:paper} on page \pageref{sec:paper}.
% assemble a thesis from separately typeset parts
\includepdfmerge{frontmatter.pdf, -, chap1.pdf, -, chap2.pdf, -}
\end{document}L’ordre produit par signature=8 : 8, 1, 2, 7, 6, 3, 4, 5
Pour un livret piqué à cheval, il faut réordonner les pages afin qu’elles tombent juste une fois pliées. Donnez à l’option signature de pdfpages un multiple de quatre : elle regroupe les pages en cahiers de cette taille et les impose automatiquement en nup=1x2 ou nup=2x1 selon l’orientation. Mesuré : un PDF de huit pages avec signature=8, landscape a produit quatre faces, et l’ordre extrait était PAGE 8, PAGE 1, PAGE 2, PAGE 7, PAGE 6, PAGE 3, PAGE 4, PAGE 5. Imprimez cela en recto verso sur deux feuilles, empilez-les et pliez une fois : les pages s’ouvrent dans l’ordre 1 à 8.
Attention : pages=-, nup=1x2, landscape ne réordonne rien du tout. Il se contente de placer deux pages côte à côte ; une fois plié, l’ordre est faux. Pour des cahiers, il faut signature. Pour une imposition plus élaborée — plusieurs cahiers, compensation de poussée, traits de coupe — TeX Live fournit aussi le package dédié booklet.
% a saddle-stitched booklet in signatures of eight pages
\includepdf[pages=-, signature=8, landscape]{booklet-doc.pdf}L’importation perd les liens : pax et l’option link
\includepdf ne reprend que l’apparence de chaque page. Les liens contenus dans le PDF source cessent de fonctionner — et le manuel de pdfpages précise que ce ne sont pas seulement les liens mais toutes les annotations PDF qui disparaissent. Pour conserver les liens d’origine, associez-le à pax (Heiko Oberdiek), qui extrait les annotations et les réinsère.
Dans l’autre sens, pdfpages peut aussi créer ses propres cibles de liens. Avec link=true, chaque page insérée devient une cible nommée ⟨nom de fichier⟩.⟨numéro de page⟩ : un \hyperlink{paper.pdf.3}{…} dans votre texte saute alors à la page importée 3. linkname=mylink change le nom de base, et linkfilename, linktodoc, linkfit et newwindow gèrent les liens vers des fichiers externes. Les options thread et threadname, pour les fils d’articles, relèvent de la même famille.
Moteurs et pilotes : quand pLaTeX et dvipdfmx donnent des pages blanches
Les moteurs que cite le manuel de pdfpages sont pdfTeX, VTeX, XeTeX, LuaTeX et pTeX : il fonctionne donc sous pdfLaTeX, LuaLaTeX, XeLaTeX comme sous (up)pLaTeX. Il suppose toutefois un moteur qui écrit directement du PDF : sur une chaîne passant par DVI, le PDF ne peut pas être importé et des pages blanches sont insérées à la place. Dans la configuration pLaTeX plus dvipdfmx courante au Japon, l’importation du PDF est le travail de dvipdfmx, et le pilote graphique doit donc être correctement désigné. L’écriture recommandée par le manuel consiste à passer dvipdfmx en option de classe.
% the driver the pdfpages manual recommends for the platex route
\documentclass[dvipdfmx]{article}
\usepackage{pdfpages}
% ...or state it explicitly on graphicx
% \usepackage[dvipdfmx]{graphicx}Cette chaîne a encore une particularité à connaître. pdfpages appelle le programme externe extractbb pour connaître le nombre total de pages du PDF importé, mais si un fichier .xbb correspondant existe déjà, il l’utilise au lieu d’appeler extractbb. Remplacez le PDF source en laissant traîner un .xbb périmé et le compte de pages ne colle plus : l’insertion se dérègle. Régénérez donc le .xbb à chaque changement du PDF. Un dernier piège, pour les documents à fond de page : le premier \pagecolor doit venir avant \usepackage{pdfpages}.