2011-06-10 3 views
7

J'essaye d'écrire quelques scripts python en utilisant pyPDF pour diviser des pages PDF en six pages séparées, les classer correctement (habituellement imprimées recto et verso, donc toutes les autres pages doivent avoir leur sous-pages commandées différemment) et supprimez les pages vierges résultantes à la fin du document de sortie.Script Python pour supprimer des pages vierges à l'aide de pyPDF

J'ai écrit le script suivant pour couper les pages PDF et les réorganiser. Coupe chaque page en deux colonnes et chaque colonne en trois pages. Je ne suis pas très expérimenté avec Python, alors s'il vous plaît excuser tout ce que je ne fais pas correctement.

#!/usr/bin/env python 
import copy, sys 
from pyPdf import PdfFileWriter, PdfFileReader 
input = PdfFileReader(sys.stdin) 
output = PdfFileWriter() 

for i in range(0,input.getNumPages(),2): 
    p = input.getPage(i) 
    q = copy.copy(p) 
    r = copy.copy(p) 
    s = copy.copy(p) 
    t = copy.copy(p) 
    u = copy.copy(p) 
    (x, y) = p.mediaBox.lowerLeft 
    (w, h) = p.mediaBox.upperRight 

    p.mediaBox.lowerLeft = (x, 2 * h/3) 
    p.mediaBox.upperRight = (w/2, h) 

    q.mediaBox.lowerLeft = (w/2, 2 * h/3) 
    q.mediaBox.upperRight = (w, h) 

    r.mediaBox.lowerLeft = (x, h/3) 
    r.mediaBox.upperRight = (w/2, 2 * h/3) 

    s.mediaBox.lowerLeft = (w/2, h/3) 
    s.mediaBox.upperRight = (w, 2 * h/3) 

    t.mediaBox.lowerLeft = (x, y) 
    t.mediaBox.upperRight = (w/2, h/3) 

    u.mediaBox.lowerLeft = (w/2, y) 
    u.mediaBox.upperRight = (w, h/3) 

    a = input.getPage(i+1) 
    b = copy.copy(a) 
    c = copy.copy(a) 
    d = copy.copy(a) 
    e = copy.copy(a) 
    f = copy.copy(a) 
    (x, y) = a.mediaBox.lowerLeft 
    (w, h) = a.mediaBox.upperRight 

    a.mediaBox.lowerLeft = (x, 2 * h/3) 
    a.mediaBox.upperRight = (w/2, h) 

    b.mediaBox.lowerLeft = (w/2, 2 * h/3) 
    b.mediaBox.upperRight = (w, h) 

    c.mediaBox.lowerLeft = (x, h/3) 
    c.mediaBox.upperRight = (w/2, 2 * h/3) 

    d.mediaBox.lowerLeft = (w/2, h/3) 
    d.mediaBox.upperRight = (w, 2 * h/3) 

    e.mediaBox.lowerLeft = (x, y) 
    e.mediaBox.upperRight = (w/2, h/3) 

    f.mediaBox.lowerLeft = (w/2, y) 
    f.mediaBox.upperRight = (w, h/3) 

    output.addPage(p) 
    output.addPage(b) 
    output.addPage(q) 
    output.addPage(a) 
    output.addPage(r) 
    output.addPage(d) 
    output.addPage(s) 
    output.addPage(c) 
    output.addPage(t) 
    output.addPage(f) 
    output.addPage(u) 
    output.addPage(e) 

output.write(sys.stdout) 

Puis-je utiliser le script suivant pour supprimer les pages blanches. Le problème semble être que tandis que les pages sont visiblement recadrées, les commandes de dessin de texte sont toujours là. Aucune de ces pages n'est scannée, donc si elles sont vides, elles sont vraiment vides. Quelqu'un at-il des idées sur quelque chose que je pourrais faire différemment ou peut-être une approche entièrement différente à prendre pour supprimer les pages blanches? J'apprécierais vraiment toute aide.

+1

Mise à jour: Si j'ouvre le résultat du premier script dans Acrobat, puis que j'utilise 'Enregistrer sous ...', il reconstruit le fichier à partir de zéro. Ensuite, lorsque je lance le deuxième script, il fonctionne comme je le souhaite. J'ai besoin d'un moyen de script le processus que fait acrobat dans 'Enregistrer sous ...' pour être utilisé dans un script qui ne nécessite pas Acrobat lui-même. – rpeck1682

+0

Ce n'est pas vraiment une réponse, je vais donc le poster comme un commentaire. Le tout devait être mis dans une application iOS une fois cela fait. Je me suis contenté de dessiner les zones appropriées du PDF original avec un paramètre pour identifier le nombre de pages vierges à la fin. Ce n'est pas idéal, mais ça fonctionne. – rpeck1682

Répondre

5

PdfFileReader a une méthode, getPage(self, page number) qui retourne un objet, PageObject, qui à son tour a une méthode getContents, qui retournera None si la page est vide. Ainsi, avec votre objet PDF, getNumPages(), parcourez avec if getPage(i).getContents():, en collectant les résultats dans une liste de numéros de pages à produire.

+0

Merci! J'avais apparemment utilisé une copie de pyPdf qui avait deux ans et qui n'avait pas la méthode getContents(). Je n'ai pas testé cette solution depuis que j'ai pris la route décrite dans un commentaire sur le post original (pas une solution, une route complètement différente). Si jamais je dois y revenir, j'utiliserai getContents() comme point de départ. – rpeck1682

Questions connexes