2011-06-10 23 views
7

Estoy tratando de escribir un par de scripts de Python usando pyPDF para dividir páginas de PDF en seis páginas separadas, ordenarlas correctamente (por lo general, las páginas anteriores deben tener su subpáginas ordenadas de manera diferente) y elimine las páginas en blanco resultantes al final del documento de salida.Script de Python para eliminar páginas en blanco usando pyPDF

Escribí la siguiente secuencia de comandos para cortar las páginas de PDF y reordenarlas. Corta cada página en dos columnas y cada columna en tres páginas. No tengo mucha experiencia con Python, así que disculpa cualquier cosa que no esté haciendo correctamente.

#!/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) 

Luego utilizo la siguiente secuencia de comandos para eliminar las páginas en blanco.

#!/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()): 
    p = input.getPage(i) 

    text = p.extractText() 

    if (len(text) > 10): 
     output.addPage(p) 

output.write(sys.stdout) 

El problema parece ser que, aunque las páginas están visiblemente recortadas, los comandos de extracción de texto siguen allí. Ninguna de estas páginas se escanea, por lo que si están en blanco, están realmente en blanco. ¿Alguien tiene alguna idea sobre algo que podría hacer de manera diferente o posiblemente un enfoque completamente diferente para eliminar las páginas en blanco? Realmente apreciaria cualquier ayuda.

+1

Actualización: si abro el resultado del primer script en Acrobat y luego uso 'Guardar como ...', reconstruye el archivo desde cero. Luego, cuando ejecuto el segundo script, funciona de la manera que quiero. Necesito una forma de guionizar el proceso que acrobat hace en 'Guardar como ...' para ser utilizado en un guión que no requiere Acrobat. – rpeck1682

+0

Esto no es realmente una respuesta, así que lo publicaré como un comentario. Todo el asunto debía incluirse en una aplicación de iOS una vez que estuviera hecho. Recurrí a dibujar las áreas apropiadas del PDF original con una configuración para identificar el número de páginas en blanco al final. No es ideal, pero funciona. – rpeck1682

Respuesta

5

PdfFileReader tiene un método, getPage(self, page number) que devuelve un objeto, PageObject, que a su vez tiene un método getContents, que devolverá None si la página está en blanco. Por lo tanto, con su objeto pdf, getNumPages(), itere con if getPage(i).getContents():, recopilando los hits en una lista de números de página para la salida.

+0

Gracias! Al parecer había estado usando una copia de pyPdf que tenía un par de años y no tenía el método getContents(). No he probado esta solución ya que tomé la ruta descrita en un comentario en la publicación original (no una solución, una ruta completamente diferente). Si alguna vez vuelvo a esto, usaré getContents() como punto de partida. – rpeck1682

Cuestiones relacionadas