Couper les pages d'un PDF en plusieurs pages [fermé]


16

J'ai un tas de fichiers PDF qui contiennent deux "vraies" pages sur une seule page PDF; Je voudrais les couper en deux et mettre chaque moitié sur une page séparée. J'ai essentiellement besoin de quelque chose qui fasse exactement le contraire de pdfnup(ou psnup). Comment cet exploit peut-il être réalisé?

La plate-forme est Linux, open source préféré; comme j'ai beaucoup de choses à faire, quelque chose qui peut être scripté (par opposition à une interface graphique) serait bien, alors je peux juste en donner une liste et la faire disparaître.

Un script préexistant n'est pas la seule option non plus; S'il existe un exemple de code permettant de manipuler les PDF de manière similaire avec une bibliothèque tierce, je peux probablement le pirater pour qu'il fasse ce que je veux.


Réponses:


22

Vous pouvez résoudre ce problème avec l'aide de Ghostscript. pdftkseul ne peut pas faire cela (à ma connaissance). Je vais vous donner les étapes à suivre en ligne de commande pour le faire manuellement. Il sera facile de créer un script pour cette procédure, avec également différents paramètres pour les tailles et les numéros de page. Mais vous avez dit que vous pouvez le faire vous-même ;-)

Comment résoudre ce problème avec l'aide de Ghostscript ...

... et pour le plaisir, je l’ai récemment fait non pas avec un fichier d’entrée comportant des pages "double-up", mais avec un "triple-up". Vous pouvez lire la réponse à cette affaire ici .

Votre cas est encore plus simple. Vous semblez avoir quelque chose de similaire à ceci:

+------------+------------+   ^
|            |            |   |
|      1     |      2     |   |
|            |            | 595 pt
|            |            |   |
|            |            |   |
|            |            |   |
+------------+------------+   v
             ^
            fold
             v
+------------+------------+   ^
|            |            |   |
|      3     |      4     |   |
|            |            | 595 pt
|            |            |   |
|            |            |   |
|            |            |   |
+------------+------------+   v
<---------- 842 pt -------->

Vous souhaitez créer un fichier PDF de 4 pages de 421 points x 595 points.

Premier pas

Commençons par extraire les sections de gauche de chacune des pages d'entrée:

gs \
    -o left-sections.pdf \
    -sDEVICE=pdfwrite \
    -g4210x5950 \
    -c "<</PageOffset [0 0]>> setpagedevice" \
    -f double-page-input.pdf

Qu'ont fait ces paramètres?

Tout d’abord, sachez qu’en PDF 1 pouce == 72 points . Ensuite, le reste est:

  • -o ...............:Nom du fichier de sortie. Implicitement utilise également -dBATCH -dNOPAUSE -dSAFER.
  • -sDEVICE=pdfwrite : nous voulons PDF comme format de sortie.
  • -g................:définit la taille du support de sortie en pixels. La résolution par défaut de pdfwrite est 720 dpi. Par conséquent, multipliez par 10 pour obtenir une correspondance pour PageOffset.
  • -c "..............:demande à Ghostscript de traiter l'extrait de code PostScript donné juste avant le fichier d'entrée principal (qui doit suivre -f).
  • <</PageOffset ....:définit le décalage de l'image de la page sur le support. (Bien sûr, pour les pages de gauche, le décalage de [0 0]n'a aucun effet réel.)
  • -f ...............: traiter ce fichier d'entrée.

Quel résultat la dernière commande a-t-elle atteint?

Celui-là:

Output file: left-sections.pdf, page 1
+------------+  ^
|            |  |
|     1      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v

Output file: left-sections.pdf, page 2
+------------+  ^
|            |  |
|     3      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v
<-- 421 pt -->

Deuxième étape

Ensuite, les bonnes sections:

gs \
    -o right-sections.pdf \
    -sDEVICE=pdfwrite \
    -g4210x5950 \
    -c "<</PageOffset [-421 0]>> setpagedevice" \
    -f double-page-input.pdf

Notez le décalage négatif puisque nous décalons la page vers la gauche tout en maintenant la zone de visualisation immobile.

Résultat:

Output file: right-sections.pdf, page 1
+------------+  ^
|            |  |
|     2      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v

Output file: right-sections.pdf, page 2
+------------+  ^
|            |  |
|     4      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v
<-- 421 pt -->

Dernière étape

Maintenant, nous combinons les pages dans un fichier. Nous pourrions le faire avec ghostscript également, mais nous l'utilisons à la pdftkplace, car c'est plus rapide pour ce travail:

pdftk \
  A=right-sections.pdf \
  B=left-sections.pdf \
  shuffle \
  output single-pages-output.pdf
  verbose

Terminé. Voici le résultat souhaité. 4 pages différentes, taille 421x595 pt.

Résultat:

+------------+ +------------+ +------------+ +------------+   ^
|            | |            | |            | |            |   |
|     1      | |     2      | |     3      | |     4      |   |
|            | |            | |            | |            |5595 pt
|            | |            | |            | |            |   |
|            | |            | |            | |            |   |
|            | |            | |            | |            |   |
+------------+ +------------+ +------------+ +------------+   v
<-- 421 pt --> <-- 421 pt --> <-- 421 pt --> <-- 421 pt -->

@ Inconnu: Merci pour le vote à la baisse! Souhaitez-vous s'il vous plaît écrire un commentaire indiquant une raison pour cela?
Kurt Pfeifle

+1 pour une utilisation géniale de l'art ASCII et des instructions très claires. Parce que je suis un CLI n00b, le \ s échappe aux lignes, donc il est plus facile à lire, non?
Compagnon Geek

@ Mullhausen: merci d'avoir corrigé la faute de frappe ( 421-> -421). ;-)
Kurt Pfeifle le

6

Il existe un outil pdfposter qui permet de créer des PDF comportant plusieurs pages pour une page d’entrée (mosaïque ou hachage des pages). Il est similaire à l'outil poster, qui fait la même chose pour les fichiers PostScript.


pdfposter ne gère pas l’impression de contenu se chevauchant sur les bords pour faciliter l’assemblage des affiches. C'est un script Perl, cependant, donc c'est assez facile à ajouter.
Matthias Urlichs

3

Ainsi, après beaucoup plus de recherches (il semblerait que "PDF pages coupées" soit une bien meilleure recherche), j'ai trouvé un petit script appelé " unpnupqui utilise poster, conversion PDF / PS", et pdftkde faire exactement ce dont j'ai besoin. C'est un peu long, mais c'est de loin supérieur aux autres méthodes que j'ai trouvées (comme utiliser imagemagick) car elles ne pixellisent pas les pages avant de les cracher.

Juste au cas où mobileread s’éloigne pour une raison quelconque, le cœur du script (distribué sous licence GPLv2 ou ultérieure par Harald Hackenberg <hackenberggmx.at>) est le suivant:

pdftk "$1" burst
for file in pg*.pdf;
do
    pdftops -eps $file
    poster -v -pA4 -mA5 -c0% `basename $file .pdf`.eps > `basename $file .pdf`.tps
    epstopdf `basename $file .pdf`.tps
done
pdftk pg*.pdf cat output ../`basename $1 .pdf`_unpnuped.pdf

1
Je dois aimer quand les gens répondent à leurs propres questions. Cependant, si vous aviez besoin de le faire avec une interface graphique, en particulier si les tailles des pages n'étaient même pas ou si vous vouliez recadrer chaque côté, consultez Briss: briss.sourceforge.net
frabjous le

Vous devriez être capable de faire ce que vous voulez avec PDFTK lui-même, sans toutes les conversions.
CarlF

@CarlF: Je pensais que ce serait possible, mais je ne vois rien dans la page de manuel de PDFTK permettant de manipuler le contenu des pages. Vous avez des indications pour moi?
Womble

@frabjous: qu'y a-t-il de mal à répondre à vos propres questions?
Kurt Pfeifle le

1
@womble: vos conversions se font via PS / EPS. Cela entraînera des pertes de qualité (polices intégrées, transparents, etc.). Ma suggestion évite la PDF => EPS => PDFvoie risquée et va de PDF => PDF => PDFmanière plus sûre .
Kurt Pfeifle le

2

J'ai trouvé que la réponse de Kurt Pfeifle était très utile dans une situation similaire. J'ai pensé que je pourrais partager ma modification de la solution avec d'autres ...

Moi aussi j'avais un PDF numérisé qui avait 2 pages sur chaque feuille. Il s’agissait d’une numérisation au format 11 x 8,5 pouces d’un livret piqué à la sellette, agrafé lors de la numérisation initiale. PDF page 2 = pages 2 et 3, etc. Cela se lit bien à l'écran, mais vous ne pouvez pas l'imprimer et l'agrafer pour faire d'autres copies du livret.

J'avais besoin de pouvoir imprimer ceci sur un copieur recto verso; c'est-à-dire le transformer de nouveau en PDF "imposé", prêt à être imprimé. Donc, en utilisant la solution de Kurt, j’ai fait ceci (ahem) "une ligne" pour le reconvertir en demi-pages, dans le bon ordre des pages à nouveau. Cela fonctionnera pour n'importe quelle hauteur et largeur, et aussi pour n'importe quel nombre de pages. Dans mon cas, j'avais un livret de 40 pages (20 pages numérisées au format PDF.)

HEIGHT=8.5 WIDTH=11 ORIG_FILE_PATH="original.pdf" \
count=$(set -xe; \
gs -o left.pdf -sDEVICE=pdfwrite \
-g$(perl -e "print(($WIDTH / 2) * 720)")x$(perl -e "print($HEIGHT * 720)") \
-c "<</PageOffset [0  0]>> setpagedevice" \
-f "$ORIG_FILE_PATH" >/dev/null; \
gs -o right.pdf -sDEVICE=pdfwrite \
-g$(perl -e "print(($WIDTH / 2) * 720)")x$(perl -e "print($HEIGHT * 720)") \
-c "<</PageOffset [-$(perl -e "print(($WIDTH / 2) * 72)")  0]>> setpagedevice" \
-f "$ORIG_FILE_PATH" | grep Page | wc -l ); \
echo '>>>>>' Re-ordering $count pages...; \
(set -xe; pdftk A=right.pdf B=left.pdf cat \
A1 `set +xe; for x in $(seq 2 $count); do echo B$x A$x; done` B1 \
output ordered.pdf); \
echo "Done. See ordered.pdf"

Il vous suffit de modifier les premiers paramètres de cette commande pour spécifier HEIGHT and WIDTH et ORIG_FILE_PATH. Le reste de la commande calcule les différentes tailles et appelle deux fois gs, puis pdftk. Il comptera même les pages de votre numérisation et produira ensuite la spécification de tri correcte (pour le scénario que j'ai donné).

Il en résulte des progrès sur ce qu'il fait, qui ressemblera à ceci:

+++ perl -e 'print((11 / 2) * 720)'
+++ perl -e 'print(8.5 * 720)'
++ gs -o left.pdf -sDEVICE=pdfwrite -g3960x6120 -c '<</PageOffset [0  0]>> setpagedevice' -f original.pdf
++ wc -l
++ grep Page
+++ perl -e 'print((11 / 2) * 720)'
+++ perl -e 'print(8.5 * 720)'
+++ perl -e 'print((11 / 2) * 72)'
++ gs -o right.pdf -sDEVICE=pdfwrite -g3960x6120 -c '<</PageOffset [-396  0]>> setpagedevice' -f original.pdf
>>>>> Re-ordering 20 pages...
++ set +xe
+ pdftk A=right.pdf B=left.pdf cat A1 B2 A2 B3 A3 B4 A4 B5 A5 B6 A6 B7 A7 B8 A8 B9 A9 B10 A10 B11 A11 B12 A12 B13 A13 B14 A14 B15 A15 B16 A16 B17 A17 B18 A18 B19 A19 B20 A20 B1 output ordered.pdf
Done. See ordered.pdf

Ensuite, pour obtenir l’imposition de page dont vous avez besoin pour un livret imprimé, il vous suffit "d’imprimer" commander.pdf sur un format de page personnalisé du format souhaité (dans mon exemple, 5,5 x 8,5), en l’envoyant à un "établissement de livret". "outil (dans mon cas, j’ai utilisé Create Booklet for Mac de Christoph Vogelbusch à l’ adresse http://download.cnet.com/Create-Booklet/3000-2088_4-86349.html ).

Le fichier PDF résultant retrouvera désormais le format de page d'origine de 11 x 8,5 avec 2 pages par feuille, mais la commande sera telle que vous pourrez l'imprimer recto verso, sur reliure à bord court et le tour est joué! vous aurez un imprimé que vous pourrez photocopier et plier et assembler, reproduisant le livret original sans jamais démonter (ni même voir) l'original.

J'espère que cela aide quelqu'un!

-c


1

Basé sur la réponse de piptas ci-dessus:

Sur les fenêtres, pour fractionner des PDF de format lettre avec une seule image de couverture au début, les opérations suivantes ont fonctionné très bien pour moi (notez l'utilisation de [-612 0] dans la deuxième étape, une valeur positive générant des pages vierges car elle poussait dans le mauvais sens. .)

gswin32c -o left-sections.pdf -sDEVICE=pdfwrite -dFirstPage=2 -g6120x7920 -c "<</PageOffset [0 0]>> setpagedevice" -f input.pdf

Notez l'utilisation -dFirstPage=2qui indique à gs de commencer le traitement à la page 2.

gswin32c -o right-sections.pdf -sDEVICE=pdfwrite -dFirstPage=2 -g6120x7920 -c "<</PageOffset [-612 0]>> setpagedevice" -f input.pdf

Cela crée right-sections.pdf de la même manière. Et maintenant, l'image de couverture:

gswin32c -o cover.pdf -sDEVICE=pdfwrite -dLastPage=1 -g6120x7920 -c "<</PageOffset [0 0]>> setpagedevice" -f input.pdf

Ensuite, comme je ne voulais pas fusionner avec pdftk en utilisant la saisie de page manuelle, j'ai divisé les sections gauche et droite en fichiers PDF distincts dans un nouveau répertoire.

mkdir input_file
copy cover.pdf input_file\0000.pdf
pdftk left-sections.pdf burst output input_file\%04d_A.pdf
pdftk right-sections.pdf burst output input_file\%04d_B.pdf

Ensuite, je joins les fichiers PDF de ce répertoire par ordre alphabétique (et heureusement, cela signifie qu'ils sont triés dans le bon ordre!) Et je répète également le résultat dans ghostscript pour corriger le message "Avertissement: numéro de génération sur une plage de 0..65535, en supposant 0. " erreurs produites par pdftk que ghostscript a appelé "itext-paulo-155 (itextpdf.sf.net-lawagie.com)" - il est également arrivé de réduire de moitié la taille du fichier dans mon utilisation. Avec un original de 4,5 Mo, le résultat de pdftk était de 6,7 Mo et le retraitement de gswin32c l'a réduit à 3,2 Mo.

pdftk input_file\*.pdf cat output input_temp.pdf
gswin32c -o final_output.pdf -sDEVICE=pdfwrite -f input_temp.pdf

Et nous avons fini! N'hésitez pas à supprimer le dossier input_file, cover.pdf, input_temp.pdf, right_sections.pdf et left_sections.pdf. ;-)


1

si vous avez juste besoin de sortir les fichiers PDF de gauche dans un seul document et les fichiers PDF de droite, dans un seul document, le script suivant, basé sur la réponse de Kurt Pfeifle, fera l'affaire (fonctionne pour toute hauteur et largeur):

$ cat split.sh
#!/bin/bash                                                                     

dims=$(pdfinfo "$1" | grep -i "page size:" | cut -d ":" -f2)                    
width=$(echo "$dims" | cut -d " " -f7)                                          
height=$(echo "$dims" | cut -d " " -f9)                                         
half_width=$(echo "$width * 0.5" | bc -l | cut -d "." -f1)                      
half_widthtt=$(echo "$width * 5" | bc -l | cut -d "." -f1)                      
heighttt=$(echo "$height * 10" | bc -l | cut -d "." -f1)                        

echo "pdf $1 has height $height and width $width"                               

gs -o "left-$1" -sDEVICE=pdfwrite -g"$half_widthtt"x"$heighttt" -c "<</PageOffset [0 0]>> setpagedevice" -f "$1"
gs -o "right-$1" -sDEVICE=pdfwrite -g"$half_widthtt"x"$heighttt" -c "<</PageOffset [-$half_width 0]>> setpagedevice" -f "$1"

puis lancez-le comme ceci:

$ ./split.sh thepdftosplit.pdf
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.