Comment «annuler la réservation» d'un pdf

10

J'ai un fichier pdf qui a été créé dans un format de brochure. Il est destiné à imprimer sur du papier A4 en orientation paysage; voici deux pages dans le pdf, qui devraient correspondre à quatre pages dans le livre actuel.

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (1)       |      (3)       |
|              |                |
|              |                |
|              |                |
 ------------------------------- 

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (4)       |      (2)       |
|              |                |
|              |                |
|              |                |
 -------------------------------

Les numéros entre parenthèses correspondent à l'ordre des pages individuelles.

Je sais qu'il y a toutes sortes de commandes (pdfbook, pdfnup, etc.) sur linux (qui a probablement été utilisé pour faire ce livret en premier lieu). Comment le «décompresser» - c'est-à-dire que j'aimerais faire un document pdf à partir de là où chaque page individuelle du produit final est une page individuelle du pdf, commandée de la manière habituelle.

Éditer

Grâce à Gilles, j'ai réussi à utiliser le code suivant:

import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
second_half = []
for i in range(0,input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)

    print >> sys.stderr, 'splitting page',i
    print >> sys.stderr, '\tlowerLeft:',p.mediaBox.lowerLeft
    print >> sys.stderr, '\tupperRight:',p.mediaBox.upperRight

    p.mediaBox.upperRight = (ur[0], (bl[1]+ur[1])/2)
    p.mediaBox.lowerLeft = bl

    q.mediaBox.upperRight = ur
    q.mediaBox.lowerLeft = (bl[0], (bl[1]+ur[1])/2)

    if i % 2 == 0:
        output.addPage(p)
        qold = q
    else:
        output.addPage(q)
        output.addPage(qold)
        output.addPage(p)
output.write(sys.stdout)
TSGM
la source
1
Je pense que cela devrait aller sur superuser.com
Adam Zalcman
@AdamZalcman Pourquoi? Il recherche un programme Linux
Michael Mrozek
2
Vous pouvez adapter cette réponse aux questions (par Gilles) à votre problème , c'est-à-dire créer un script PyPdf.
sr_
Êtes-vous sûr de ne pas avoir échangé les pages 3 et 4? J'ai travaillé dans l'impression; cette disposition n'a aucun sens ....
Wildcard

Réponses:

4

Voici un petit script Python utilisant la bibliothèque PyPdf qui fait le travail. (Dérivé de un2up.) Enregistrez-le dans un script appelé unbook, rendez-le exécutable ( chmod +x unbook) et exécutez-le en tant que filtre ( unbook <book.pdf >1up.pdf).

J'ai testé ce script sur la sortie de pdfbook --signature=N. Pour une autre méthode, vous n'aurez peut-être pas besoin d'inverser toutes les autres pages d'entrée et l'ordre des pages peut être différent (cela dépend de l'orientation des pages paysage). La disposition de la page ne correspond pas à votre question; le 13,42 n'a pas de sens pour moi (dans un livre de 4 pages, 3 devrait être à côté de 2, pas à côté de 1).

#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
second_half = []
for i in range(0,input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)
    (w, h) = p.mediaBox.upperRight
    p.mediaBox.upperRight = (w/2, h)
    q.mediaBox.upperLeft = (w/2, h)
    if i % 2 == 0:
        p.rotateClockwise(180)
        q.rotateClockwise(180)
        output.addPage(p)
        second_half.append(q)
    else:
        output.addPage(p)
        second_half.append(q)
second_half.reverse()
for q in second_half: output.addPage(q)
output.write(sys.stdout)

Ignorez tout avertissement de dépréciation; seuls les responsables PyPdf doivent s'en préoccuper.

Gilles 'SO- arrête d'être méchant'
la source
Cette question a été posée il y a quelque temps, mais j'ai du mal à implémenter votre solution. J'utilise OSX, j'ai installé python et py27-pypdf via MacPorts. J'ai créé un fichier non réservé et copié et collé le script. L'exécution de la commande comme indiqué crée un nouveau fichier 1up.pdf avec 0 octet. Aucune erreur ou quoi que ce soit n'est répertoriée dans mon terminal, mais lors de l'exécution de la commande, rien ne se passe (je dois CTRL-C out); le système ne se bloque pas et ne semble rien faire. Comment puis-je retrouver le problème? @Gilles
TSGM
@TSGM L'explication la plus probable est que vous avez oublié l' <avant le fichier d'entrée. Si vous êtes vraiment absolument sûr d'avoir écrit la commande correctement, cela pourrait être un bogue dans la bibliothèque PyPdf (cela ne m'a pas encore échoué, mais cela pourrait arriver).
Gilles 'SO- arrête d'être méchant'
Le problème était que je devais appeler python via "python unbook <in.pdf> out.pdf". Que je suis bête. De plus, votre code était un peu étrange (il collait toutes les pages de la seconde moitié à la fin. Il semble que je l'ai corrigé pour le format que j'ai écrit dans le message d'origine). J'ai modifié ma réponse d'origine pour contenir le code que j'ai finalement utilisé. En outre, les commandes de taille de page semblent incorrectes. J'ai également corrigé cela. @Gilles
TSGM
@TSGM Le code suppose une mise en page de 1 | 4 avers, 2 | 3 revers, qui est la mise en page de livre habituelle. Vous devrez peut-être le modifier si vos pages sont présentées différemment. Il a été testé sur le terrain dans ce cadre. Votre appel explicite a pythonété mon erreur: j'aurais dû mettre une ligne de shebang, a ajouté.
Gilles 'SO- arrête d'être méchant'